Node.js 子进程 - 错误:spawn node ENOENT

4

我正在使用这段代码来尝试生成一个需要运行脚本的子进程。

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);

我该如何修复它?


2
我的猜测是,script 没有返回正确的文件路径到 myscript.js。你能在 script 上做一个 console.log 吗? - fortunee
@fortunee 我在想错误可能是我传递给它的env对象有问题。像你建议的那样,我在脚本上做了一个 console.log ,它会返回脚本所在的正确路径。也许我还需要在子脚本中添加shebang #!/usr/bin/env node - newbiedev
我同意@fortunee的观点。在不同平台上,路径表示可能会有所不同。例如,“/”应该替换为“\”,或者你需要指定完整的路径。 - Malakai
@Reborn,我已经进行了一些调试,这不是路径相关的问题,而是与我正在尝试传递给脚本的env对象有关。文档中写道,env需要一个键值对,但也许我传递的方式不正确? - newbiedev
1个回答

3
如果你想在子进程中执行node二进制文件,最好引用它的完整路径,你可以使用process.execPath找到它。
这应该解决你的问题。
child(process.execPath, [script], {
        cwd: __dirname,
        env: {
            TEST_USERNAME: 'myuser',
            TEST_PASSWORD: 'mypassword'
        }
    }).on('error', (error) => {
        console.log(error);
    });

这个解决方案解决了问题,谢谢。 - newbiedev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接