我想使用Node.js的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)
curl --digest http://login:password@" + ip + "/webdav/file.json
。 - Yonnaled{maxBuffer: undefined}
,那么缓冲区大小就没有限制了。在内部,child_process
会在命令产生输出时分配小的缓冲区块,因此它从不预先分配maxBuffer
大小的缓冲区,而是根据需要增长。maxBuffer
只是作为一个故障保护机制来停止输出过多的进程。undefined
恰好可以通过验证检查,并且也规避了故障保护机制。这并没有在任何地方记录,并且可能随时停止工作。请谨慎使用。 - Allon GuralnekmaxBuffer
是一个副本。操作系统根据自己的规则为stdout
分配了一个内部缓冲区。如果proc
要超出该缓冲区的容量,它将被挂起。假设满足了 Node.js 发出要求(我相信只要缓冲区中有任何一个简单的换行符?),subprocess.stdout.on
将获取缓冲区的一部分,将其发送到处理程序,并且释放该部分,让操作系统恢复正在产生的子进程。我相信 stdout 的 C API 要求它只是一个 cbuf[],具有一些索引,作为一个通用的环形数组暴露出来。这一切都正确吗? - Groostav