59

json オブジェクトを送信するときに bodyParser() ミドルウェアからエラーをキャッチしたいのですが、一般的な 400 エラーではなくカスタム応答を送信したいので無効です。

これは私が持っているもので、動作します:

app.use (express.bodyParser ());
app.use (function (error, req, res, next){
    //Catch bodyParser error
    if (error.message === "invalid json"){
        sendError (res, myCustomErrorMessage);
    }else{
        next ();
    }
});

しかし、これは非常に醜いアプローチのように思えます。なぜなら、将来の Express バージョンで変更される可能性があるエラー メッセージを比較しているからです。bodyParser() エラーをキャッチする他の方法はありますか?

編集:

これは、リクエストの本文に無効な json が含まれている場合のエラーです。

{
  stack: 'Error: invalid json\n    at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)\n    at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)\n    at IncomingMessage.EventEmitter.emit (events.js:92:17)\n    at _stream_readable.js:872:14\n    at process._tickDomainCallback (node.js:459:13)',
  arguments: undefined,
  type: undefined,
  message: 'invalid json',
  status: 400
}

きれいに印刷されたスタック:

Error: invalid json
    at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)
    at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)
    at IncomingMessage.EventEmitter.emit (events.js:92:17)
    at _stream_readable.js:872:14
    at process._tickDomainCallback (node.js:459:13)
4

9 に答える 9

27

あなたの最善の策は、次をチェックすることだと思いますSyntaxError

app.use(function (error, req, res, next) {
  if (error instanceof SyntaxError) {
    sendError(res, myCustomErrorMessage);
  } else {
    next();
  }
});
于 2013-04-04T18:57:56.577 に答える