【发布时间】:2017-10-15 15:09:52
【问题描述】:
我正在尝试从我的 Node 应用程序运行 ripgrep 并看到 child_process.spawn 的奇怪行为:没有任何事件触发并且应用程序永远不会完成(卡在 spawn 调用中的某处):
import { spawn } from 'child_process';
async function run() {
await spawnWrapper('rg', ['-F', '"demo"'], { cwd: __dirname });
}
export function spawnWrapper(command, args, options) {
return new Promise((resolve, reject) => {
let stdout = '';
let stderr = '';
const child = spawn(command, args, options);
console.log('spawn wrapper');
child.on('close', (code, signal) => {
console.log('close');
resolve({ code, signal, stdout, stderr });
});
child.on('error', (error) => {
console.log('error');
(error as any).stderr = stderr;
reject(error);
});
child.on('exit', (code, signal) => {
console.log('exit');
resolve({ code, signal, stdout, stderr });
});
child.stdout.setEncoding('utf8');
child.stderr.setEncoding('utf8');
child.stdout.on('data', (data) => {
console.log('stdout data');
stdout += data;
});
child.stderr.on('data', (data) => {
console.log('stderr data');
stderr += data;
});
});
}
我只在控制台中得到“spawn wrapper”,没有其他事件。我从来没有在其他二进制文件中看到过这种行为,也许是ripgrep 的问题,但我不应该至少得到 Node 的一些提示吗?有关如何调试此问题的任何建议?
【问题讨论】:
-
您可以使用本地调试器并将其设置为在所有 JS 异常上中断,它应该会向您显示代码失败的原因。
-
gist.github.com/Stuk/6226938 这个围绕 child_process 的示例包装器没有使用 close 事件,也许没有必要?这是此类 github.com/mgenware/promised-spawn 的另一个示例
标签: node.js child-process spawn