首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将未缓冲的数据从STDOUT输送到ServerResponse?

如何将未缓冲的数据从STDOUT输送到ServerResponse?
EN

Stack Overflow用户
提问于 2013-04-01 22:37:31
回答 2查看 3.4K关注 0票数 4

如何将未缓冲的输出从子进程输送到HTTP.ServerResponse?

下面的Node.js代码确实适用于缓冲输出,但不适用于非缓冲输出。

代码语言:javascript
复制
var http = require('http'),
    spawn = require('child_process').spawn;

http.createServer(function (req, res) {
    req.on('data', function (data) {
        var ping = spawn("ping", ["127.0.0.1"]);
        ping.stdout.pipe(res);
        ping.stderr.pipe(res);
        req.connection.on('end', function() {
            ping.kill();
        });
    });
});

这是ping 127.0.0.1的输出

代码语言:javascript
复制
ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1

因为ping将请求超时写入STDOUT作为未缓冲的数据,所以上面的代码只有在ping成功时才能工作。

我使用的是Node.js v0.8.19。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-08 14:33:49

这是一个不一定仅限于共同问题的Node.js。

如果您在Unix上,可以使用unbuffer脚本,它是期望的一部分。大多数GNU系统还提供了stdbuf,它允许您做同样的事情(尽管我对它并不十分熟悉)。

如果要使用unbuffer,只需将上面的示例更改为:

代码语言:javascript
复制
var ping = spawn("unbuffer", ["ping", "127.0.0.1"]);

如果您在Windows上,情况就会更加困难,因为Windows本机没有提供与PTY类似的任何类型的功能。像温蒂 (及其JavaScript绑定,pty.js)这样的项目试图使用Windows控制台API重新创建这个功能,尽管我发现它们的实现有些错误和不完整。

ActiveState的win32 Expect包并不是最容易安装的东西,而且在默认发行版中也没有包含unbuffer脚本。但是,如果您设法使一切正常工作,并对Unix unbuffer脚本做了一些小的修改,那么您应该能够编译一个unbuffer可执行文件,然后可以从Node调用它。

票数 5
EN

Stack Overflow用户

发布于 2013-04-02 09:23:07

您将在请求连接结束时终止ping进程,一旦在服务器上成功地接收到请求,就会发生这种情况。ping在输出Request timeout for icmp_seq 5之前一直关闭。

试着做这样的事

代码语言:javascript
复制
var http=require('http');
var spawn = require('child_process').spawn;
http.createServer(function (req, res) {
        var ping = spawn("ping", ["127.0.0.1","-c","20"]);
        ping.stdout.pipe(res);
        ping.stderr.pipe(res);
}).listen(8080);

注意: ping永远在继续,所以您不能等待它的结束。使用-c来平x次数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15753133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档