使用节点child_process的Stdout缓冲区问题

我试图执行curl使用节点child_process从本地networking中的共享文件夹中获取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) 

使用child_process.exec时需要使用并设置maxBuffer选项。 从文档 :

maxBuffer指定在stdout或stderr上允许的最大数据量 – 如果超过此值,subprocess将被终止。

该文档还指出, maxBuffer的默认值是200KB。

例如,以下代码中的最大缓冲区大小增加到500KB:

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

此外,你可能想了解一下http.get ,看它是否能够实现你正在尝试做的事情。

我有一个类似的问题,我已经解决了从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); });