簡単な画像 (画像) ダウンロード サーバーです。Express.js がリクエストを受け取り、MongoDB GridFS から画像を取得し、ファイルで応答します。
リクエストが有効な場合(リクエストしたファイルが存在する場合)はOKです。
MongoError
問題は、クエリが失敗したとき (つまり、要求された画像が存在しないとき)をキャッチできないことです。
import Grid from 'gridfs-stream'
const root = 'fs_images'
// This func returns the file stream
export function getReadStream (id) {
const gfs = Grid(mongoose.connection.db, mongoose.mongo)
const options = {
_id: id,
mode: 'r',
root: root
}
const readStream = gfs.createReadStream(options)
readStream.on('error', function (err) {
// throw here
// it performs the same without this on-error hook;
// if comment the `throw err`, nothing will happens
// but I want the caller knows the error
throw err
})
return readStream
}
そしてこれがルーター
router.get('/:fileId', function (req, res, next) {
const fileId = req.params.fileId
try {
const imgReadStream = image.getReadStream(fileId)
imgReadStream.pipe(res)
} catch (err) {
// nothing catched here
// instead, the process just crashed
console.log(err)
}
}
そして、私はエラーをキャッチできません。存在しないものをリクエストしようとするMongoError
と、コンソールに表示され、アプリが is でクラッシュしerrno
ます1
。
コンソール出力の先頭:
/.../node_modules/mongodb/lib/utils.js:123
process.nextTick(function() { throw err; });
^
MongoError: file with id 123456123456123456123456 not opened for writing
at Function.MongoError.create (/.../node_modules/mongodb-core/lib/error.js:31:11)
これは少し異なる場合があります。他の場所で がスローされた場合Error
、エラー ハンドラ ( app.use(function(err, req, res, next){ /* ... */})
)、または少なくとも のデフォルト ハンドラによってキャッチされ、プロセスがクラッシュすることなく がExpress.js
返されます。500
要するに、MongoError
手動で処理できるように (つまり、404
応答を返すように)、アプリにこれを認識してキャッチしてもらいたいのです。