網站搜尋

javascript - 使用 node child_process 時的標準輸出緩衝區問題


我正在嘗試使用 Node 的 child_process 執行 curl,以從本地網路的共享資料夾中獲取一個 JSON 文件(約 220Ko)。但它實際上返回了一個緩衝區問題,我無法解決。這是我的代碼:

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)

答案#1

當使用 child_process.exec 時,你需要使用並設定 maxBuffer 選項。根據文件說明:

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 的資料,以了解它是否能夠達成你正在嘗試做的事情。

答案#2

我遇到過類似的問題,後來我從 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);
});