2017-06-07 1 views
1

Ich habe eine Standard-Fehler-Handler-Setup in meiner Express-Anwendung als so.Warum wird mein Fehler nicht in meiner ausdrücklichen Antwort zurückgegeben?

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

Aber immer wenn ich eine Route rufe und ein Fehler geworfen wird, bekomme ich eine Antwort, die so aussieht.

Kann mir jemand helfen zu verstehen, warum Express meinen Fehler als leeres Objekt zurückgibt?

+1

Haben Sie diese Middleware-Funktion am Ende Ihrer Routen definiert? –

+0

Ja, es funktioniert ansonsten genauso wie erwartet. Wenn ich '{error: err}' in '{error: errr.stack}' ändere, bekomme ich das, was ich erwarte, ich bin mehr neugierig auf die Mechanismen des Error Object/express, die das verursachen. –

Antwort

4

Der Grund Error Instanzen als leeren Objekte dargestellt werden, ist, weil die normalen Eigenschaften (z.B. .message, .stack, etc.) auf einem Error Objekt nicht als enumerable und JSON.stringify() (verwendet von res.json()) gesetzt ignoriert nicht-enumerable Eigenschaften.

Wenn Sie nur den Nachrichtenteil senden möchten (ohne den Stack-Trace), könnten Sie diese stattdessen tun:

res.json({ error: err.message }); 

oder

res.json({ error: { message: err.message } }); 

Andernfalls, wenn Sie andere benutzerdefinierte aufnehmen möchten , aufzählbare Eigenschaften, die möglicherweise auf die Error Instanz angeheftet wurden, könnten Sie .message aufzählbar machen und dann denselben Code verwenden, den Sie jetzt verwenden:

Object.defineProperty(err, 'message', { enumerable: true }); 
res.json({ error: err }); 
+0

Danke für die schnelle und gründliche Antwort! –

Verwandte Themen