如何将无缓冲的数据从STDOUT传输到ServerResponse?

Rus*_*uss 4 node.js

如何将子进程的无缓冲输出传递给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();
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

以下是来自的输出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
Run Code Online (Sandbox Code Playgroud)

由于ping写入请求超时作为无缓冲数据到STDOUT ,上面的代码只有ping成功才有效.

我正在使用Node.js v0.8.19.

sch*_*mod 5

这是一个常见问题,不一定限于Node.js.

如果您使用的是Unix,则可以使用unbuffer脚本,这是Expect的一部分.大多数GNU系统也提供stdbuf,它可以让你做同样的事情(尽管我不太熟悉它).

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

var ping = spawn("unbuffer", ["ping", "127.0.0.1"]);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Windows,那么事情会变得更加困难,因为Windows本身并不提供任何类似的等价物PTY.诸如winpty(及其JavaScript绑定,pty.js)之类的项目尝试使用Windows控制台API重新创建此功能,尽管我发现它们的实现有点错误和不完整.

ActiveState的win32 Expect包不是最容易安装的,并且不包括unbuffer默认发行版中的脚本.但是,如果您设法使一切正常工作并对Unix unbuffer脚本进行一些小的修改,您应该能够编译unbuffer可执行文件,然后可以从Node调用.