노드 child_process를 사용하는 Stdout 버퍼 문제


91

로컬 네트워크의 공유 폴더에서 JSON 파일 (약 220Ko)을 가져 오기 위해 node child_process를 사용하여 curl을 실행하려고합니다. 그러나 실제로 얻을 수없는 버퍼 문제를 반환합니다. 내 코드는 다음과 같습니다.

var exec = require('child_process').exec;

var execute = function(command, callback){
    exec(command, function(error, stdout, stderr){ callback(error, stdout); });
};

execute("curl http://" + ip + "/file.json", function(err, json, outerr) {
    if(err) throw err;
    console.log(json);
})

그리고 여기에 내가 얻는 오류가 있습니다.

if(err) throw err;
          ^
Error: stdout maxBuffer exceeded.
    at Socket.<anonymous> (child_process.js:678:13)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:746:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    at emitReadable (_stream_readable.js:404:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)
    at Pipe.onread (net.js:526:21)

답변:


161

을 (를) 사용할 maxBuffer때 옵션 을 사용하고 설정해야합니다 child_process.exec. 로부터 문서 :

maxBuffer stdout 또는 stderr에 허용되는 최대 데이터 양을 지정합니다.이 값이 초과되면 하위 프로세스가 종료됩니다.

문서에는 기본값 maxBuffer이 200KB 라고도 나와 있습니다.

예를 들어 다음 코드에서는 최대 버퍼 크기가 500KB로 증가합니다.

var execute = function(command, callback){
    exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ callback(error, stdout); });
};

또한, 당신이하려는 일을 http.get성취 할 수 있는지 알아보기 위해 읽는 것이 좋습니다.


이것은 내 문제를 해결했습니다. 감사합니다! 공유 폴더는 실제로 다이제스트 인증이 필요한 webdav 프로토콜 아래에 있습니다. 그래서 저는 매우 쉽게 처리하는 curl을 사용하고 있습니다.curl --digest http://login:password@" + ip + "/webdav/file.json
Yonnaled

이 기본값은 엄청나게 작습니다. 찾기 어려운 방식으로 물린 것은 이번이 두 번째입니다.
jlh

3
기본값은 이제 1MB @jlh, nodejs.org/api/…입니다.
Carlos

57

비슷한 문제가 있었고 exec에서 spawn으로 이동하는 문제를 해결했습니다.

var child = process.spawn('<process>', [<arg1>, <arg2>]);

child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

child.on('close', function (code) {
    console.log('child process exited with code ' + code);
});


10
이는 것 같다 가장 적합한 두 가지의 솔루션
Hashbrown

1
이 대답이 반드시 가장 적절한 대답은 아닙니다. 질문의 콘솔 출력이 예일 수 있다고 생각합니다. 200KB 파일을 가져 와서 콘솔에 던지는 사람은 거의 없습니다. 그러나 process.execCLI 도구와 같은 것에서 사용되는 경우 예,로 전환하는 spawn것이 좋습니다.
Pavel Gatilov

1
와우 ... 스폰이 멋지다. 콜백이나 약속도 사용하지 않고 이벤트 만 사용합니다. 콘솔에 stdout을 스트리밍하는 데 정말 유용 할 수 있습니다. @Pavel Gatilov, 그것이 바로 우리가하는 일입니다. 는 FFmpeg 버퍼에 수신자 이루어지는 모든 초 ... 진보 보여 좋아
레이 포스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.