2012-02-10 12 views
17

私は、起動時にstdinから入力を読み込むnode.jsスクリプト/サーバを持っています。しかし、時には渡すべきデータがありません。この場合、dataendイベントも呼び出されないので、これは面倒です。これがいつnode.jsコードで検出されるのですか?node.js:空の標準入力ストリームを検出するにはどうすればいいですか?

クライアントの不便さを避けるため、入力の末尾に特別な「終了」文字を追加することを避けたいと思います。関連するコードは、以下である:

var newHTML = ''; 
    var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb'); 
    process.stdin.on('data', function(chunk){ 
    gfm.stdin.write(chunk); 
    }); 
    process.stdin.on('end', function(){ 
    gfm.stdin.end(); 
    }); 
    gfm.stdout.on('data', function(data) { 
    newHTML += data; 
    }); 
    gfm.on('exit',function(ecode){ 
    socket.emit('newContent', newHTML); 
    }); 
    process.stdin.resume(); 
+1

はあなたがprocess.stdin.onみました( 'エラー'、関数(){})? – Marshall

+0

またはgfm.stdout.on( 'error'、function(){}) – Marshall

+0

解決策が見つかりましたか?それは不可能と思われる。 – antitoxic

答えて

3

空かないSTDINストリームはprocess.stdinからendイベントによって検出されます。

この簡単なスクリプトstdin.jsがあることを示しています。

var spawn = require('child_process').spawn; 
var cat = spawn('/bin/cat'); 
cat.stdout.on('data', function(data) { console.log(data) }); 
cat.stdout.on('end', function() { console.log('EOF') }); 

process.stdin.pipe(cat.stdin); 
:このスクリプト pipe.jsは、生成された子プロセスへのパイプを使用すると、非常にうまく機能することを実証する

$ echo test | node stdin.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node stdin.js 
EOF 
$ node stdin.js < /dev/null 
EOF 
$ 

process.stdin.on('data', function(data) { console.log(data) }); 
process.stdin.on('end', function() { console.log('EOF') }); 

異なるシナリオ

期待通り:

$ echo test | node pipe.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node pipe.js 
EOF 
$ node pipe.js < /dev/null 
EOF 
$ 
4

私は起こっている可能性があると信じています。

はØysteinSteimlerの例では、あなたのアプリにを/ dev/nullを送り示しています。あなたはストリーミングしないとき

ノードpipe.js <を/ dev/null

しかし、対処したことがありませんアプリにすべてのstdin。 node pipe.jsを実行するだけで、まだstdinを待っているため、終了しません。

あなたが例えばcat

はこの実行してみてください、他のUNIXプログラムで、この自分自身をテストすることができます。

cat < /dev/null 

今だけ実行してみてください:

cat 

それはそれので、終了しませんがstdinを待っています。端末に入力し、Enterキーを押してプログラムに送信することができます。それはあなたがCTRL + D

+2

これはいつ発生するのでしょうか?私は 'readline''' close'や 'process.stdin''end'イベントを受け取っていません。 – spiffytech

1

で行うことができますEOFを受信するまで、まだ終了しない(と複数の入力を待つ)はあなたが行うことができます何かが、あなたのアプリが-sどのような引数を受け入れるようにすることですstdinから読み込みます。LiveScriptのCLIツールが何をするかだ

-s, --stdin read stdin

関連する問題