2017-10-15 58 views
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但仍然,我不应该得到至少一些提示节点?有关如何调试的建议?

+0

您可以使用本地调试器并将其设置为中断所有JS异常,它应该显示出代码失败的原因。 – niklon

+0

https://gist.github.com/Stuk/6226938这个包含child_process的封装不使用关闭事件,也许没有必要?这是类https://github.com/mgenware/promised-spawn的另一个例子 – niklon

回答