Node.js 处理process.stdout';数据';事件

Node.js 处理process.stdout';数据';事件,node.js,Node.js,我有些代码似乎无法修复。情况如下: var childProcess = require('child_process'); var spawn = childProcess.spawn; child = spawn('./simulator',[]); child.stdout.on('data', function(data){ console.log(data); } ); child.stdin.write(INPUTS); 这一切都在我的web应用

我有些代码似乎无法修复。情况如下:

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

child.stdout.on('data',
    function(data){
        console.log(data);
    }
);
child.stdin.write(INPUTS);
这一切都在我的web应用程序的后端,该应用程序正在运行特定类型的模拟。模拟器可执行文件是一个c程序,它运行一个循环,等待传递数据(通过其标准输入),当输入进入模拟时(即来自客户端),我解析输入,然后将数据写入子进程stdin,如下所示:

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

child.stdout.on('data',
    function(data){
        console.log(data);
    }
);
child.stdin.write(INPUTS);

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

如果您在web应用程序中处理IO,那么您确实希望使用异步方法。您需要以下内容(未经测试)。有一个很好的示例介绍了如何使用中的
API


佩乔维奇的解决方案可行,但我更喜欢


根据您的问题领域,有许多优秀的流帮助程序值得研究。看看substack。

缓冲区块大小应用于节点中。在节点之外执行的任何操作都不能解决问题。若不在消息传递协议中做一些额外的工作,就无法从节点中获得所需的内容。任何大于区块大小的消息都将被区块化。有两种方法可以处理此问题

  • 如果在开始流出C之前知道总输出大小,请将消息长度预先添加到数据中,以便节点进程知道在终止整个消息之前要提取多少块
  • 确定从C程序发送的消息中可以附加的特殊字符。当node看到该字符时,结束该消息的输入
    我遇到了同样的问题。我尝试了很多不同的事情,开始感到恼火。我试着在前面加上特殊字符。也许我很愚蠢,但我就是做不好

    我遇到了一个名为的模块,它基本上解析每个块,直到它看到一个
    EOF
    。您可以这样使用它:

    process.stdout.pipe(new Linerstream()).on('data', (data) => {
        // data here is complete and not chunked 
    });
    
    重要的一点是,您必须使用以
    EOF
    结尾的行将数据写入
    stdout
    。否则它不知道这是结束


    我可以说这让我很努力。希望它能帮助其他人

    欢迎使用async。相关:您可以尝试该函数,而不是“流动”数据@但佩乔维奇说得有道理。。为什么您需要同时使用所有数据?不幸的是,我不能让c程序一次又一次地启动。它需要不断地运行,从标准输入接受数据并将其打印到标准输出。有一个解决方案,我打印一个特定的单词,以导致某种“结束”,我只是认为这可能是一个简单的解决办法。谢谢安东尼,很高兴知道。碰巧的是,我只是在做一个丑陋的黑客打印到最后的标准错误。似乎工作正常,但它确实会让我面临无法控制的问题,导致“打印到标准”错误返回到最后一次“打印到标准”输出之前的节点进程。无论如何,很高兴知道,谢谢。@user1276273首先返回标准错误的原因很可能是因为STDERR通常会阻止IO(IO在其他任何事情发生之前完成),而STDOUT可以被抢占。因此,如果您先启动STDOUT,然后立即启动STDERR,那么STDOUT的IO可能仍在运行,并且STDERR将获得优先级并完成,然后STDOUT将完成。你要么必须手动刷新标准输出,然后发出标准输出消息,要么必须将数据和控制信号全部放入标准输出。哇,好的,这非常有用。这确实时常发生,我不知道为什么。非常感谢您提供这一信息。