windows 上的节点 child_process.spawn 错误文件描述符与 ipc

Node child_process.spawn bad file descriptor on windows with ipc

我正在尝试通过 child_process spawn 在带有 ipc 选项的节点中生成一个命令。

我叫什么:

const {spawn} = require('child_process');
const cmd = spawn('npm', ['-v'], {
    shell: true,
    stdio: ['inherit', 'inherit', 'inherit', 'ipc']
});
cmd.on('message', (msg) => console.log(msg));

我得到的:

child_process.js:122
  p.open(fd);

Error: EBADF: bad file descriptor, uv_pipe_open

Child (child_process.js:122:5)
    at setupChildProcessIpcChannel (internal/bootstrap/pre_execution.js:329:30)
    at prepareMainThreadExecution (internal/bootstrap/pre_execution.js:54:3)
    at internal/main/run_main_module.js:7:1 {
  errno: -4083,
  code: 'EBADF',
  syscall: 'uv_pipe_open'
}

只有在特殊配置下才会发生这种情况:

  1. 在 windows
  2. 带有 'ipc' 选项
  3. spawned 命令是 js 中的东西
    将失败:another.jsnpm
    不会失败:node

有个closed issue用处不大

根据这个article,我需要 shell: true 来实现跨平台兼容性。

这个issue好像也有关系,但是我看了之后并没有变聪明

节点 v12.18.3

感谢您的帮助。

您不能将 'ipc' 与 npm 一起使用,因为 npm“二进制”是一个 shell 脚本,而不是节点进程(参见 https://github.com/npm/cli/tree/latest/bin

documentation

Accessing the IPC channel fd in any way other than process.send() or using the IPC channel with a child process that is not a Node.js instance is not supported.

对于 another.js,使用 fork(将始终有效)或 spawn('node', 'another.js') 如果您不使用节点垫片(如 nodist)