1

簡単な画像 (画像) ダウンロード サーバーです。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応答を返すように)、アプリにこれを認識してキャッチしてもらいたいのです。

4

1 に答える 1