2017-10-19 6 views
1

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).

Répondre

1

try/catch ne fonctionnera pas car l'erreur se produit dans une coche différente (de manière asynchrone). Peut-être que vous pourriez écouter l'erreur dans le routeur à la place?

const imgReadStream = image.getReadStream(fileId) 

imgReadStream.on('error', function(err) { 
    // Handle error 
}); 

imgReadStream.pipe(res)