#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. Это решение решило проблему, спасибо.