Vyhledávání na webu

javascript - Problém s výstupním bufferem při použití node child_process


Snažím se spustit curl pomocí node child_process, abych získal JSON soubor (asi 220 kB) ze sdílené složky v místní síti. Ale ve skutečnosti to vrací problém s bufferem, který nedokážu obejít. Zde je můj kód:

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);
})

A tady je chyba, kterou dostávám:

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)

Odpověď č. 1

Při používání child_process.exec musíte použít a nastavit možnost maxBuffer. Z dokumentace:

maxBuffer specifikuje největší množství dat povolené na stdout nebo stderr - pokud je tato hodnota překročena, potom je podřízený proces ukončen.

Dokumentace také uvádí, že výchozí hodnota maxBuffer je 200 KB.

Jako příklad je v následujícím kódu maximální velikost vyrovnávací paměti zvýšena na 500 KB:

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

Dále byste si mohli chtít přečíst o http.get, abyste zjistili, zda je schopen dosáhnout toho, co se snažíte udělat.

Odpověď č. 2

Měl jsem podobný problém a vyřešil jsem ho přešel z exec na 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);
});

Související články