Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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_Spawn_Node Red - Fatal编程技术网

在javascript中生成:延迟标准输出,如何禁用缓冲区?

在javascript中生成:延迟标准输出,如何禁用缓冲区?,javascript,node.js,spawn,node-red,Javascript,Node.js,Spawn,Node Red,我正在尝试执行一个程序(二进制),它定期在标准输出上打印值 对于exec,它工作得很好,但是对于spawn,结果只会在一段时间后出现,为什么?我能做些什么 const opcv=spawn("myprog",["-L","2","-o","pairs","-r"], { shell:false, stdio:"pipe" }) opcv.stdout.on('data', (data) => { node.log("opcdata stdout=" + data);

我正在尝试执行一个程序(二进制),它定期在标准输出上打印值

对于exec,它工作得很好,但是对于spawn,结果只会在一段时间后出现,为什么?我能做些什么

  const opcv=spawn("myprog",["-L","2","-o","pairs","-r"], { shell:false, stdio:"pipe" })
  opcv.stdout.on('data', (data) => {
      node.log("opcdata stdout=" + data);
    });
  opcv.stderr.on('data', (data) => {
      node.log("opcdata stderr=" + data);
    });
我尝试使用{stdio:“inherit”}选项,在这种情况下,我可以直接看到数据,但无法使用“.stdout.on”(“再:

TypeError:无法读取null的属性“on”

编辑
它似乎与我试图运行的程序相关联,但不幸的是,无法在程序中禁用标准输出缓冲,是否可以使用除cmd以外的另一个shell来执行它,或者它们是其他技巧?

我使用spawn()和管道。唯一的区别是我使用pause&resume来防止缓冲区溢出。node.log()是什么如果是二进制数据,大多数日志记录都会遇到困难。请尝试放置console.log(data.length);然后你会得到一个恒定的流吗。?不,输出的数据是字符串。node.log是一个日志函数,在node red中,由于它不在客户端执行,console.log不会有帮助。使用pause&resume是什么意思?对我来说,似乎只有当它是flushingInside my on('data')事件时,我才会得到stdout,我将stdin.pause(),使用数据,然后stdin.resume();这可以防止缓冲区溢出..我用它与node.js和Delphi应用程序之间的二进制协议通信,速度非常快。你确定你调用的程序没有缓冲吗?它是stdout?我没有向stdin发送任何内容…我不确定如何检查程序是否在缓冲,但我知道如果我手动执行它,它会打印新行直接发送到stdout,无需像使用SPWAN一样等待。我不是说您正在向stdin发送任何内容,暂停它使另一端等待,直到您使用完数据,然后恢复通知另一端继续发送数据。Stdio/stdout的缓冲区空间有限,因此如果不使用,可能会耗尽对于数据atm来说,这很可能不是您的问题。但是,假设您开始将数据泵入数据库等,并且需要等待记录被保存,stdin.pause()就可以了。另外,您调用的程序在控制台中的缓冲区和刷新方面可能会有不同的行为。