child_process.spawn不会发出任何事件

时间:2017-10-15 15:09:52

标签: node.js child-process spawn

我试图从我的Node应用程序运行ripgrep并看到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;
        });
    });
}

我只得到"产生包装"在控制台中,没有其他事件。我从未在其他二进制文件中看到这种行为,也许它与ripgrep有关,但仍然不应该至少得到Node的一些提示吗?关于如何调试这个的任何建议?

1 个答案:

答案 0 :(得分:0)

这是由ripgrep等待输入引起的,这对我来说并不明显(在命令行上,它只是直接执行)。详情请见https://github.com/BurntSushi/ripgrep/issues/410