ノードchild_processを使用した標準出力バッファの問題


91

ノード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)

回答:


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

このデフォルトは途方もなく小さいです。これは私がこれを見つけにくい方法で噛まれたのは2回目です。
jlh

3
デフォルトは現在1MB @ jlh、nodejs.org
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
これは2つの最も適切な解決策のようです
Hashbrown

1
この答えは必ずしも最も適切なものではありません。質問のコンソール出力は一例に過ぎないと思います。200KBのファイルをフェッチしてコンソールにスローすることはほとんどありません。ただし、process.execがCLIツールなどで使用されている場合は、はい、への切り替えspawnが適切です。
Pavel Gatilov

1
うわー...スポーンはかっこいいです。コールバックやプロミスを使用することすらありません...イベントだけです。これは、stdoutをコンソールにストリーミングするのに非常に役立ちます。@Pavel Gatilov、それがまさに私たちがやっていることです。FFMpegは毎秒進行状況を表示するのが好きです...これはバッファに負荷をかけます
Ray Foss
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.