2017-03-29 15 views
0

ノードが正しく認識されている場合、リスナーは接続後に発生するイベントのみを受信します。 missing.txtにファイルがないとします。これは動作します:fs.createReadStreamでエラーが発生しました

'use strict'; 
const fs = require('fs'); 
var rs = fs.createReadStream('missing.txt'); 
rs.on('error', (err) => console.log('error ' + err)); 

それが生成する:エラーエラー:ENOENT:そのようなファイルやディレクトリはありません、オープン... \ missing.txt

は、なぜその仕事をしますか?また、次のように四行目を変更して動作します:

setTimeout(() => rs.on('error', (err) => console.log('error ' + err)) , 1); 

しかし、5msのにタイムアウトを変更すると、エラーが未処理のイベントとしてスローされます。

イベントリスナーの追加が遅れても、発生したエラーをキャッチするレースをセットアップしていますか?ストリームとして開く前に、ファイルの存在を明示的にチェックする必要がありますか?しかし、これはfs.existsに関してNode docs stateという別のレースを作り出すことができます。「他のプロセスが2つの呼び出しの間でファイルの状態を変更する可能性があります。 Moroeoverでは、イベントリスナーは他のエラーを捕捉するので便利です。

明示的な遅延を導入することなく、存在しないファイルをストリーミングしようとするエラーを聞くのに十分速くイベントリスナーが追加されると仮定するのがベストプラクティスですか?

答えて

0

少なくともまで放出さ/スローされることはありませんfs.createReadStream()からReadStreamインスタンスを取得した後に発生したエラー次のダニ。したがって、同期をとっている間は、常に「エラー」リスナーを作成した後にストリームにアタッチすることができます。 ReadStreamがコンストラクタの最後にthis.open()を呼び出すため、setTimeoutの実験が動作することがあります。 ReadStream.prototype.open()メソッドは、指定したファイルパスからファイルディスクリプタを取得するためにfs.open()を呼び出します。これは非同期関数でもあるので、 'エラー'リスナをsetTimeoutの中に添付すると競合条件が作成されることを意味します。

fs.open()がコールバックをエラーで呼び出すか、setTimeout()がコールバックを呼び出して「エラー」リスナーをアタッチしています。 ReadStreamインスタンスを作成した後で「エラー」リスナーをアタッチするのはまったく問題ありませんが、同期をとるようにしてください。競合状態に問題はありません。

+0

偉大な答え。次のティックの意味を理解していない人のための[イベントループ](http://stackoverflow.com/questions/21607692/understanding-the-event-loop)の詳細はこちらです。 – Govdata1

1

This error occur when there no such location exists or creating permission are not with user program.

これが役に立つかもしれません:

var filename = __dirname+req.url; 

var readStream = fs.createReadStream(filename); 
    readStream.on('open', function() { 
    readStream.pipe(res); 
}); 

readStream.on('error', function(err) { 
    res.end(err); 
}); 

Why are you listening error on timeout ?

おかげ

+0

元の質問を編集して、なぜタイムアウト時にエラーを聞くのかを明確にしました。 – Govdata1

関連する問題