0
我试图从我的Node应用程序运行ripgrep,并且看到一个奇怪的行为child_process.spawn
:没有事件触发,应用程序也没有完成(被卡在spawn调用中的某处):child_process.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
但仍然,我不应该得到至少一些提示节点?有关如何调试的建议?
您可以使用本地调试器并将其设置为中断所有JS异常,它应该显示出代码失败的原因。 – niklon
https://gist.github.com/Stuk/6226938这个包含child_process的封装不使用关闭事件,也许没有必要?这是类https://github.com/mgenware/promised-spawn的另一个例子 – niklon