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
을 가지고 뭔가 있을지 모르지만, 여전히 노드에 의한 힌트를 얻지 말아야 하는가? 이 디버깅하는 방법에 대한 제안?
로컬 디버거를 사용하여 모든 JS 예외를 위반하도록 설정하면 코드가 실패한 것을 표시해야합니다. – niklon
https://gist.github.com/Stuk/6226938이 예제 래퍼 child_process 주변 이벤트를 활용하지 않습니다, 아마도 그것은 필요하지 않습니다? 다음은 이러한 클래스의 또 다른 예입니다. https://github.com/mgenware/promised-spawn – niklon