2011-09-11 7 views
2

私はfs.readFileを使用してオープンして読むことができるa.txtというファイルを持っています。しかし、私はcreateReadStreamで読むことができません:Node.js ReadStreamは決して 'data'リスナーを呼びません

var fs = require('fs'); 

var stream = fs.createReadStream('a.txt'); 
stream.on('data', function() { console.log('data present'); }); 

これは決して何も印刷されません、私は何が欠けていますか?

+0

'a.txt'に内容がありますか? –

+0

はい、これは単なる例です。私は実際にmp3ファイルを読み込んでいます。 – Diego

+0

しかし、このコードでこの例を使用している場合、問題は別の場所にあります。 –

答えて

1

このような状況は私には起こりましたか? REPLでこのコードを実行したときに起こっていることは、入力した各行の間でノードのイベントループに制御フローが戻るということです。それが起こると、ノードは保留中のIOを実行する機会を得ています。しかし、あなたがリスナーを付けていないので、 'データ'イベントは喜んで忘れ去られます。

これを確認するには、上記のコードをjavascriptファイルに貼り付け、スクリプトとして実行します。コントロールがイベントループに戻る前にリスナーが接続されるため、正常に動作します。

この問題のバージョンは、ストリームを開いてコールバックで処理しようとしたときに発生しました。囲み関数でストリームを開き、コールバックからストリームを参照しても機能しませんでした - ノードは、イベントリスナーが接続される前に、すべてのデータを既にポンピングしていました。

この2つの方法のいずれかを解決することができます。ストリームを開くとすぐにポーズを呼び出すか、コールバックを実行する前にリスナーを接続してください。

0

試してみてください。

var data = ''; 

var rs = fs.createReadStream('/path/to/file'); 

rs.on('data', function(data) { 
    data += data; 
}); 

rs.on('end', function() { 
    console.log(data); 
}); 
0

念のために、正しくファイルへのパスを取得してみてください。

var path = __dirname + '/a.txt'; 
console.log(path); 
var stream = fs.createReadStream(path); 
関連する問題