处理来自 process.stdout 'data' 事件的分块响应

use*_*273 4 node.js

我有一些代码似乎无法修复。它看起来如下:

var childProcess = require('child_process');
var spawn = childProcess.spawn;
child = spawn('./simulator',[]);

child.stdout.on('data',
    function(data){
        console.log(data);
    }
);
Run Code Online (Sandbox Code Playgroud)

这一切都在我的 Web 应用程序的后端,该应用程序正在运行特定类型的模拟。模拟器可执行文件是 ac 程序,它运行一个循环,等待传递数据(通过其标准输入)。当输入用于模拟时(即来自客户端),我解析输入,然后将数据写入子进程 stdin如下:

child.stdin.write(INPUTS);
Run Code Online (Sandbox Code Playgroud)

现在返回的数据是 40,000 字节。但数据似乎被分成 8192 字节的块。我尝试修复 c 程序的标准输出缓冲区,但没有修复它。我想知道node.js 施加的“数据”事件的大小是否有限制?我需要它作为一大块回来。

Ant*_*oer 6

缓冲区块大小应用于节点中。您在节点之外执行的任何操作都无法解决问题。如果不在消息传递协议中进行一些额外的工作,就无法从节点获得您想要的东西。任何大于块大小的消息都将被分块。有两种方法可以处理这个问题。

  1. 如果您在开始从 C 中流出之前知道总输出大小,请将消息长度添加到数据中,以便节点进程知道在终止整个消息之前要提取多少块。
  2. 确定可以附加到从 C 程序发送的消息中的特殊字符。当节点看到该字符时,您就结束该消息的输入。


Per*_* P. 5

如果您在 Web 应用程序中处理 IO,您确实希望坚持使用异步方法。您需要类似以下内容(未经测试)。文档Stream中有一个关于如何使用 API 的很好的示例

var data = '';
child.stdout.on('data',
    function(chunk){
        data += chunk;
    }
);    

child.stdout.on('end',
    function(){
        // do something with var data
    }
);
Run Code Online (Sandbox Code Playgroud)