4

バッファされていない出力を子プロセスから 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 を使用しています。

4

2 に答える 2

5

これは、必ずしも Node.js に限定されない一般的な問題です。

Unix を使用している場合は、 Expectunbufferの一部であるスクリプトを使用できます。ほとんどの GNU システムには も用意されており、これで同じことを実行できます (ただし、私はあまり詳しくありません)。 stdbuf

を使用する場合はunbuffer、上記の例を次のように変更するだけです。

var ping = spawn("unbuffer", ["ping", "127.0.0.1"]);

Windows を使用している場合、Windows はネイティブでPTY. winpty (およびその JavaScript バインディングであるpty.js )などのプロジェクトは、 Windows コンソール APIを使用してこの機能を再作成しようとしていますが、それらの実装にはややバグがあり、不完全であることがわかりました。

ActiveState の win32 Expect パッケージは、インストールが最も簡単ではなくunbuffer、デフォルトのディストリビューションにはスクリプトが含まれていません。ただし、すべてが機能し、Unix スクリプトにいくつかの小さな変更を加えることができれば、実行可能ファイルunbufferをコンパイルできるはずです。これを Node.js から呼び出すことができます。unbuffer

于 2013-08-08T14:33:49.343 に答える
0

サーバーでリクエストが正常に受信されるとすぐに発生するリクエスト接続終了時に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 回の ping を実行します。

于 2013-04-02T09:23:07.203 に答える