2017-10-15 11 views
0

내 노드 응용 프로그램에서 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 주변 이벤트를 활용하지 않습니다, 아마도 그것은 필요하지 않습니다? 다음은 이러한 클래스의 또 다른 예입니다. https://github.com/mgenware/promised-spawn – niklon

답변