2012-08-08 21 views
22

Soy un principiante absoluto de NodeJS y quiero crear un servicio REST-Web simple con Express y Mongoose.Error al manejar con Mongoose

¿Cuál es la mejor práctica para manejar los errores de Mongoose en un lugar central?

Cuando en cualquier lugar se produce un error de base de datos Quiero devolver un Http-500-Error-página con un mensaje de error:

if(error) { 
    res.writeHead(500, {'Content-Type': 'application/json'}); 
    res.write('{error: "' + error + '"}'); 
    res.end(); 
} 

En el antiguo tutorial http://blog-next-stage.learnboost.com/mongoose/ leí acerca de un oyente de error global:

Mongoose.addListener('error',function(errObj,scope_of_error)); 

Pero esto no parece funcionar y no puedo encontrar algo en el official Mongoose documentation sobre este oyente. ¿He verificado los errores después de cada solicitud de Mongo?

Respuesta

40

Si está utilizando Express, los errores se manejan normalmente ya sea directamente en su ruta o dentro de una API construida sobre mangosta, reenviando el error a next.

app.get('/tickets', function (req, res, next) { 
    PlaneTickets.find({}, function (err, tickets) { 
    if (err) return next(err); 
    // or if no tickets are found maybe 
    if (0 === tickets.length) return next(new NotFoundError)); 
    ... 
    }) 
}) 

El NotFoundError podrían ser inhalados en su error handler middleware a proporcionar servicios de mensajería personalizado.

Se puede abstraer un poco, pero igual deberá acceder al método next para pasar el error por la cadena de rutas.

PlaneTickets.search(term, next, function (tickets) { 
    // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node 
}) 

En cuanto a la gestión centralizada de los errores de mangostas, en realidad no hay un solo lugar para manejarlos. Los errores pueden ser manejados en varios niveles diferentes:

connection errores se emiten en los connection sus modelos están utilizando, por lo

mongoose.connect(..); 
mongoose.connection.on('error', handler); 

// or if using separate connections 
var conn = mongoose.createConnection(..); 
conn.on('error', handler); 

Para consultas/actualizaciones típicas/elimina el error se pasa a su devolución de llamada.

PlaneTickets.find({..}, function (err, tickets) { 
    if (err) ... 

Si usted no pasa una devolución de llamada el error se emite en el Modelo si está escuchando para ello:

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request! 
ticket.save(); // no callback passed 

Si usted no pasa una devolución de llamada y no está escuchando errores en el nivel model se emitirán en los modelos connection.

La clave para llevar aquí es que desea tener acceso a next de alguna manera para transmitir el error.

+0

Gracias, su respuesta útil aclara mucho sobre el manejo de errores para mí. – Sonson123

+0

¡Gran respuesta! Especialmente la sugerencia sobre el uso de next() para vincular directamente al middleware de manejo de errores de ExpressJS. –

+0

Eso no funciona con mongoose.connection.on ('error', controlador); o conn.on ('error', manejador); para mí, definí handler como una función que console.log() el primer arg pero nada aparece en la consola del servidor. – Vadorequest

Cuestiones relacionadas