如何将未缓冲的输出从子进程输送到HTTP.ServerResponse?
下面的Node.js代码确实适用于缓冲输出,但不适用于非缓冲输出。
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的输出
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。
发布于 2013-08-08 14:33:49
这是一个不一定仅限于共同问题的Node.js。
如果您在Unix上,可以使用unbuffer脚本,它是期望的一部分。大多数GNU系统还提供了stdbuf,它允许您做同样的事情(尽管我对它并不十分熟悉)。
如果要使用unbuffer,只需将上面的示例更改为:
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调用它。
发布于 2013-04-02 09:23:07
您将在请求连接结束时终止ping进程,一旦在服务器上成功地接收到请求,就会发生这种情况。ping在输出Request timeout for icmp_seq 5之前一直关闭。
试着做这样的事
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次数。
https://stackoverflow.com/questions/15753133
复制相似问题