2012-08-08 13 views
22

Sono un principiante assoluto di NodeJS e desidero creare un semplice servizio Web REST con Express e Mongoose.Gestione degli errori con Mongoose

Qual è la procedura migliore per gestire gli errori di Mangusta in un punto centrale?

Quando nessuna parte un errore di database si verifica voglio restituire un Http-500-Error-page con un messaggio di errore:

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

Nel vecchio esercitazione http://blog-next-stage.learnboost.com/mongoose/ ho letto di un ascoltatore errore globale:

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

Ma questo non sembra funzionare e non riesco a trovare qualcosa nello official Mongoose documentation su questo listener. Ho controllato gli errori dopo ogni richiesta Mongo?

risposta

40

Se si utilizza Express, gli errori vengono generalmente gestiti direttamente nel percorso o all'interno di un'API costruita sopra a mangimi, inoltrando l'errore 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)); 
    ... 
    }) 
}) 

Il NotFoundError potrebbe essere annusò nel vostro error handler middleware per fornire messaggistica personalizzato.

Alcune astrazioni sono possibili ma è comunque necessario accedere al metodo next per passare l'errore lungo la catena di percorso.

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

Per quanto riguarda la gestione centralizzata degli errori Mongoose, theres non proprio un posto per gestire em all. Gli errori possono essere gestiti a vari livelli:

connection errori vengono emessi sui connection vostri modelli utilizzano, in modo

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

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

per le query tipiche/aggiornamenti/rimuove l'errore è passato al callback.

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

Se non si passa una richiamata l'errore viene emesso sul modello se si sta ascoltando per esso:

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

Se non si passa una richiamata e non sta ascoltando errori al livello model verranno emessi sui modelli connection.

La chiave da asporto qui è che si desidera accedere a next in qualche modo per passare l'errore lungo.

+0

Grazie, la tua risposta utile chiarisce molto sulla gestione degli errori per me. – Sonson123

+0

Ottima risposta! Soprattutto il suggerimento sull'utilizzo di next() per collegarsi direttamente al middleware di gestione degli errori di ExpressJS. –

+0

Che non funziona con mongoose.connection.on ('errore', gestore); o conn.on ('errore', gestore); per me, ho definito il gestore come una funzione che console.log() il primo argomento ma non appare nulla sulla console del server. – Vadorequest