Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用节点子进程的标准输出缓冲区问题_Javascript_Node.js - Fatal编程技术网

Javascript 使用节点子进程的标准输出缓冲区问题

Javascript 使用节点子进程的标准输出缓冲区问题,javascript,node.js,Javascript,Node.js,我试图使用node child_进程执行curl,以从本地网络中的共享文件夹中获取一个JSON文件(大约220Ko)。但它实际上返回了一个我无法解决的缓冲区问题。 这是我的密码: var exec = require('child_process').exec; var execute = function(command, callback){ exec(command, function(error, stdout, stderr){ callback(error, stdout)

我试图使用node child_进程执行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)
if(err)抛出err;
^
错误:超出标准输出maxBuffer。
在插座上。(child_process.js:678:13)
位于Socket.EventEmitter.emit(events.js:95:17)
在插座上。(_stream_readable.js:746:14)
位于Socket.EventEmitter.emit(events.js:92:17)
在emitReadable上(_stream_readable.js:408:10)
在emitReadable(_stream_readable.js:404:5)
在readableAddChunk(_stream_readable.js:165:9)
在Socket.Readable.push(_stream_Readable.js:127:10)
at Pipe.onread(net.js:526:21)

使用
child\u process.exec时,需要使用并设置
maxBuffer
选项。从:

maxBuffer
指定stdout或stderr上允许的最大数据量-如果超过此值,则将终止子进程

文档还说明
maxBuffer
的默认值为200KB

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

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

此外,您可能想了解一下,看看它是否能够实现您正在尝试的目标。

我也遇到了类似的问题,我已将其从exec改为SPARN:

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);
});
var child=process.spawn(“”,[,]);
child.stdout.on('data',函数(data){
log('stdout:'+数据);
});
子.stderr.on('data',函数(data){
log('stderr:'+数据);
});
子.on('close',函数(代码){
console.log('子进程以代码'+code'退出);
});

为答案添加一些解释

exec命令在将数据发送到父进程之前对数据进行缓冲。它通常适用于产生较小输出的命令。发生上述错误是因为执行命令生成的输出大于最大缓冲区大小。解决上述问题的一种方法是按照Tim Cooper的回答指定缓冲区大小

var execute = function(command, callback){
exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ 
 callback(error, stdout); });
};
另一种解决方案是使用spawn方法,该方法通常比exec更快,并且在发送之前不缓冲数据。它以流的形式发送数据,因此不会出现缓冲区大小的问题。Isampaio使用的代码段

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);
});
var child=process.spawn(“”,[,]);
child.stdout.on('data',函数(data){
log('stdout:'+数据);
});
子.stderr.on('data',函数(data){
log('stderr:'+数据);
});
子.on('close',函数(代码){
console.log('子进程以代码'+code'退出);
});

这解决了我的问题,谢谢!共享文件夹实际上在webdav协议下,该协议需要摘要身份验证,这就是为什么我使用curl,它可以非常轻松地通过
curl--digest来处理它http://login:password@“+ip+”/webdav/file.json
此默认值小得离谱。这是我第二次以一种很难找到的方式被它咬到。默认值现在是1MB@jlh,这似乎是这两个问题的解决方案。这个答案不一定是最合适的。我认为问题中的控制台输出可能只是一个例子。几乎没有人会拿出一个200KB的文件来把它扔到控制台上。但是,如果在CLI工具中使用了
process.exec
,那么是的,切换到
spawn
应该是正确的选择。哇。。。产卵很酷。它甚至不使用回电或承诺。。。只是一些事件。这对于将stdout流式传输到控制台非常有用@帕维尔·加季洛夫,这正是我们正在做的。FFMpeg喜欢每秒钟显示进度。。。这会对缓冲区造成影响