2016-09-08 18 views
0

はコードです:なぜこのコードは 'エラー'イベントでエラーをキャッチしませんか?ここ

'use strict'; 

let fs = require('fs'); 

module.exports = (fileName, res) => { 
    fs.createReadStream(fileName) 
     .pipe(res) 
     .on('error', err => { 
      console.log('==========>> ERROR : ' + err.message); 
      res.statusCode = 500; 
      res.end('Internal Server Error: 500'); 
     }) 
     .on('end', res.end); 
}; 

ENOENT:そのようなファイルやディレクトリはありません」と、サーバがクラッシュを間違った「ファイル名を」指定した場合のメッセージ。

.on( 'error'、...)ブロックでこのコードがエラーをキャッチしないのはなぜですか?

ありがとうございます!

+1

エラーのその点には決して達していないので、最初の問題はfileNameです。コードのその部分でクラッシュします。つまり、ERROR:が呼び出されません。 – Roberrrt

答えて

1

一見して、私はあなたが実際にそれをストリームに添付していないと思います。そこ先のストリームを超えるエラーがないので、エラーコールバックが呼び出されない

The readable.pipe() method returns a reference to the destination stream making it possible to set up chains of piped streams

Stream.pipe()マニュアルを参照してください。

試してみてください。

module.exports = (fileName, res) => { 
    fs.createReadStream(fileName) 
     .on('error', err => { 
      console.log('==========>> ERROR : ' + err.message); 
      res.statusCode = 500; 
      res.end('Internal Server Error: 500'); 
     }) 
     .on('end', res.end) 
     .pipe(res); 
}; 

...または(より明確かつundestandable):

module.exports = (fileName, res) => { 
    var iStream = fs.createReadStream(fileName); 
    iStream.on('error', err => { 
     console.log('==========>> ERROR : ' + err.message); 
     res.statusCode = 500; 
     res.end('Internal Server Error: 500'); 
    }); 
    iStream.on('end', res.end); 
    var oStream = iStream.pipe(res) // returns refernce to the output stream (actually res); 
}; 

...一方、私はストリームが実際に作成されるかどうかわからないんだけどファイルが存在しない場合おそらく

fs.createReadStream()自体はが実際にそうストリームを作成する前に、エラーを投げるだろう、このような理由のために、あなたはおそらくtry {...} catch(){...}ブロックで囲む必要があります。

とにかく私はそれについては分かりません。 createReadStream()がファイルを開く前にストリームを作成し、ファイルが実際に存在しない場合は(ストリームを介して)エラーをスローすると、(コーディングの観点から)より便利になります。しかし、これは前に調査またはテストされるべきです。

+1

それは、ありがとう、多くの作品! –

関連する問題