2013-04-22 5 views
5

Ho una funzione chiamata a che accetta un callback, che viene invocato con un errore se ce n'è uno.Qual è il modo giusto per creare messaggi di errore che vengono restituiti in una richiesta Express?

a viene richiamato in una richiesta di instradamento espresso. Se c'è un errore, l'errore dovrebbe essere la risposta della richiesta.

function a(cb) { 
    cb(new Error('Some error message')) 
} 

app.get('/', function (req, res) { 
    a(function (error) { 
    if (error) { 
     res.json(error, 400) 
    } 
    res.send('No error') 
    }) 
}) 

Ho esaminato il codice per espresso, e sembra che res.json in stringa mia error. Tuttavia, il risultato di questo è una stringa vuota:

> var e = new Error('Some error message') 
undefined 
> JSON.stringify(e) 
'{}' 
> e.message 
'Some error message' 

Ci sono modi ho potuto ottenere il mio percorso di restituire il messaggio di errore qui, come la conversione l'oggetto errore toString nel mio percorso. Tuttavia, vorrei sapere qual è la migliore pratica per la formattazione dei messaggi di errore nelle API dei nodi e se ciò cambi le cose qui. Devo formattare i messaggi di errore in modo diverso, o devo solo gestire l'oggetto Error nel percorso, come ad esempio:

res.json({ error: error.message }, 400) 
+0

Alcuni dettagli sul perché manca l'e.message: http://stackoverflow.com/questions/18391212/is-it-not-possible-to-stringify-an-error-using-json-stringify. – Smartkid

risposta

0

Express percorsi possono utilizzare un terzo argomento next che può essere usato o saltare il percorso corrente semplicemente chiamando next(), o trasmettere errori chiamando next(err).

Prova con:

app.get('/', function (req, res, next) { 
    a(function (error) { 
    if (error) { 
     next(error); 
    } 
    else { 
     res.send('No error') 
    } 
    }); 
}); 

Per maggiori informazioni, consultate http://expressjs.com/api.html#app.param

1

Non ora che cosa la vostra risposta sembra, quando si verifica alcun errore, ma questo è come Di solito gestisco le risposte JSON:

function (err, data) { 
    if (err) { 
     res.json({ 
      success: false, 
      error: err.message 
     }, 400); 
    } 
    else { 
     res.json({ 
      success: true, 
      data: data 
     }); 
    } 
} 

Provare a racchiudere questo in un middleware/funzione extra. Mantenere la firma delle funzioni simile allo stile di nodo standard. (Errore del primo parametro, seguendo i parametri dei dati effettivi.) In questo modo è molto semplice per il cliente elaborare le risposte, poiché tutto ciò che si deve fare è esaminare il campo success.

+0

Sembra promettente, grazie. Aspetterò un po 'prima di accettare questa è la risposta. –

5

Per aggiungere a @ di steveukx risposta, è possibile specificare un gestore di errori in espresso, da .use ing una funzione con arity di quattro .

app.use(function(err, req, res, next){ 
    res.json(500, { 
    error: err.message 
    }); 
}); 

Che verrà chiamato ogni volta che si fa next(err). Vedi the docs.

Problemi correlati