C'est un serveur de téléchargement d'image facile (image), Express.js reçoit la demande, obtient une image de MongoDB GridFS et répond avec le fichier.L'erreur ne peut pas être détectée avec Express.js et gridfs-stream
C'est OK quand la requête est valide (quand le fichier demandé existe).
Le problème est que je ne peux pas attraper le MongoError
lorsque la requête a échoué (c'est-à-dire que l'image demandée n'existe pas).
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
}
Et c'est le routeur
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)
}
}
Et je ne peux pas attraper le err. Lorsque j'essaie de demander quelque chose qui n'existe pas, les messages MongoError
s'affichent dans la console et l'application se bloque avec errno
en 1
.
tête de sortie de la console:
/.../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)
Cela peut être un peu différent. Si quelque part se lève un Error
il sera attrapé par mon gestionnaire d'erreurs (app.use(function(err, req, res, next){ /* ... */})
), ou au moins par le gestionnaire par défaut de Express.js
, et renvoie un 500
, sans le processus plantant. En bref, je veux que l'application sache et attrape ce MongoError
afin que je puisse le gérer manuellement (c'est-à-dire renvoyer une réponse 404
).