2017-10-15 28 views
0

私のNodeアプリケーションからripgrepを実行しようとしていて、child_process.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; 
     }); 
    }); 
} 

私はコンソールに「スポーンラッパー」を取得します。他のイベントはありません。私は他のバイナリでこの動作を見たことがありませんでした。おそらくripgrepと何かがありますが、ノードによって少なくともいくつかのヒントを得るべきではないでしょうか?これをデバッグする方法に関する提案はありますか?

+0

ローカルデバッガを使用して、すべてのJS例外を無効にすることができます。 – niklon

+0

https://gist.github.com/Stuk/6226938この例のchild_processラッパーはcloseイベントを使用しませんが、おそらくそれは必要ではありませんか?このようなクラスの別の例をhttps://github.com/mgenware/promised-spawn – niklon

答えて

関連する問題