2017-06-07 15 views
1

私は明示的なアプリケーションでデフォルトのエラーハンドラの設定をしています。私の返信で私の​​エラーが返されないのはなぜですか?

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

しかし、私がルートを呼び出してエラーがスローされると、私はこのような応答を得ています。

{ 
    "error": {} 
} 

誰かが私のエラーを空のオブジェクトとして返す理由を理解するのに役立つ人がいますか?

+1

ルートの最後にミドルウェア機能を定義しましたか? –

+0

それ以外の場合は期待どおりに動作します。 '{error:err}'を '{error:err.stack} 'に変更すると、私は期待していることを得て、これを引き起こしているError Object/Expressのメカニズムについてもっと興味があります。 –

答えて

4

Errorインスタンスが空のオブジェクトとして示されている理由は、通常のプロパティがErrorオブジェクト上(例えば.message.stack、等)として列挙及びJSON.stringify()は(res.json()によって使用される)が設定されていないので、非列挙プロパティを無視します。

あなただけ(スタックトレースは含まない)メッセージ部分を送信する場合は、あなたの代わりにこれを行うことができます:あなたは他のカスタムを含めたい場合はそうでない

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

または

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

を、インスタンスに列挙可能な列挙可能なプロパティの場合、.messageを列挙可能にして、今使っているのと同じコードを使用することができます:

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

迅速な回答をありがとう! –

関連する問題