дочерний процесс nodejs — Ошибка: достаточно узла для создания

#node.js #child-process

Вопрос:

Я использую этот код, чтобы попытаться создать дочерний процесс, которому необходимо запустить сценарий.

 const child = require('child_process').spawn;
const path = require('path');
const script = path.format({dir: __dirname, base: 'myscript.js'});

    child('node', [script], {
        cwd: __dirname,
        env: {
            TEST_USERNAME: 'myuser',
            TEST_PASSWORD: 'mypassword'
        }
    }).on('error', (error) => {
        console.log(error);
    });

 

Я получаю эту ошибку, когда пытаюсь запустить свой index.js скрипт

 Error: spawn node ENOENT
    at Process.ChildProcess._handle.onexit (node:internal/child_process:276:19)
    at onErrorNT (node:internal/child_process:476:16)
    at processTicksAndRejections (node:internal/process/task_queues:80:21) {
  errno: -2,
  code: 'ENOENT',
  syscall: 'spawn node',
  path: 'node',
  spawnargs: [ '/Users/dev/Desktop/cli-training/demo.js' ]
}
 

Обновить

Я пытаюсь запустить дочерний сценарий после того inquirer.js , как у пользователя возникнут некоторые вопросы. Может быть, в этом проблема?Я заметил, что дочерний процесс не будет выполнен. Внутри моего дочернего сценария у меня есть этот код

 const { IgApiClient } = require('instagram-private-api');
const chalk = require('chalk');

console.log(chalk.magenta('Starting child script'));

const ig = new IgApiClient();

console.log(process.argv);
 

Как я могу это исправить?

Комментарии:

1. Я предполагаю, script что это не возвращает правильный путь к файлу myscript.js . Можете ли вы сделать console.log script это ?

2. @fortunee Я думал, что ошибка связана с env объектом, который я передаю ему. Я сделал console.log над сценарием, как вы предложили, и он вернет правильный путь, по которому находится сценарий. Может быть, мне нужно добавить shebang #!/usr/bin/env node также в дочерний сценарий?

3. Я бы согласился с @fortunee. Может быть так, что представление пути может отличаться на разных платформах. Например, / следует заменить на и/или вам нужно указать полный путь к нему.

4. @Reborn Я провел некоторую отладку, это не проблема, связанная с путем, но она связана с объектом env, который я пытаюсь передать сценарию. В документации написано, что env нужна пара ключ-значение, но, может быть, я передаю ее неправильно?

Ответ №1:

Если вы хотите выполнить двоичный файл узла в дочернем процессе, лучше обратиться к его полному пути, вы можете найти его с помощью process.execPath

это должно решить вашу проблему

 child(process.execPath, [script], {
        cwd: __dirname,
        env: {
            TEST_USERNAME: 'myuser',
            TEST_PASSWORD: 'mypassword'
        }
    }).on('error', (error) => {
        console.log(error);
    });
 

Комментарии:

1. Это решение решило проблему, спасибо.