노드 child_process를 사용하는 stdout 버퍼 문제
로컬 네트워크의 공유 폴더에서 JSON 파일(약 220Ko)을 가져오기 위해 노드 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)
를 사용하고 설정해야 합니다.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); });
};
또한, 사용자가 수행하려는 작업을 수행할 수 있는지 확인하기 위해 에 대해 읽어 볼 수도 있습니다.
비슷한 문제가 있어서 exec에서 spon으로 이동하여 수정했습니다.
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);
});
답에 설명을 덧붙이고 있습니다.
exec 명령은 데이터를 상위 프로세스로 보내기 전에 버퍼링합니다.이것은 일반적으로 작은 출력을 생성하는 명령에 적합합니다.명령 실행으로 생성된 출력이 최대 버퍼 크기보다 크기 때문에 위 오류가 발생했습니다.위 문제를 해결하는 한 가지 방법은 팀 쿠퍼가 답변한 대로 버퍼 크기를 지정하는 것입니다.
var execute = function(command, callback){
exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){
callback(error, stdout); });
};
또 다른 해결책은 일반적으로 exec에 비해 빠른 스폰 방법을 사용하는 것이며 전송하기 전에 데이터를 버퍼링하지 않습니다.데이터를 스트림으로 전송하기 때문에 버퍼 크기 문제가 발생하지 않습니다.Isampaio에서 사용하는 코드 조각입니다.
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);
});
가장 빠른 솔루션:
이 라인이 버퍼를 출력하는 경우:
childProc.stdout.on('data', (data) => console.log(data)); // <Buffer 1b 5b 34 6d>
다음으로 변경하면 됩니다.
childProc.stdout.on('data', (data) => console.log(`${data}`)); // bla bla bla
JS 콘솔에서 버퍼를 인코딩합니다.
또는 다음을 간단히 사용할 수 있습니다.console.log(data.toString())
.
언급URL : https://stackoverflow.com/questions/23429499/stdout-buffer-issue-using-node-child-process
'bestsource' 카테고리의 다른 글
jQuery 개체에서 셀렉터를 가져오려면 어떻게 해야 합니까? (0) | 2023.10.16 |
---|---|
C#을 사용하여 MySQL에 대한 DateTime 변환 (0) | 2023.10.16 |
AJAX와 함께 워드프레스 사용자 지정 메타박스 입력값 (0) | 2023.10.11 |
테이블 이름 tb1을 잠그려고 하는데 PHPmyAdmin을 사용하여 잠글 수 없습니다. (0) | 2023.10.11 |
n=5일 때 내 컴파일러와 OS로 pow(n,2)가 24를 반환하는 이유는 무엇입니까? (0) | 2023.10.11 |