Випуск буфера Stdout із використанням вузла child_process


91

Я намагаюся виконати curl, використовуючи вузол child_process, щоб отримати файл 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становить 200 КБ.

Наприклад, максимальний розмір буфера збільшено до 500 КБ у наступному коді:

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
справляється

За замовчуванням це смішно мало. Це мене вдруге вкусило важкодоступним способом.
jlh

3
За замовчуванням зараз 1 Мб @jlh, nodejs.org/api/…
Карлос,

57

У мене була подібна проблема, і я виправив її, переходячи з exec на ікру:

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
Здається, це найбільш підходяще рішення з цих двох
Хешбровн

1
Ця відповідь не обов'язково є найбільш підходящою. Я думаю, що консольний вихід у питанні може бути лише прикладом. Навряд чи хтось дістане файл розміром 200 КБ, щоб перекинути його на консоль. Однак, якщо process.execвін використовується в таких речах, як інструменти CLI, тоді так, перехід на це spawnмає бути правильним шляхом.
Павло Гатілов

1
вау ... нерест - це круто. Це навіть не використання зворотних дзвінків або обіцянок ... просто події. Це може бути дуже корисно для потокового передавання stdout на консоль. @Pavel Гатілов, це саме те, що ми робимо. FFMpeg любить демонструвати прогрес щосекунди ... що позначається на буфері
Рей Фосс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.