Подтвердить что ты не робот

Catch express bodyParser error

Я хочу поймать ошибку из промежуточного программного обеспечения bodyParser(), когда я отправляю объект json, и это неверно, потому что я хочу отправить настраиваемый ответ вместо общей ошибки 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 ();
    }
});

Но это кажется мне очень уродливым, потому что я сравниваю сообщение об ошибке, которое может измениться в будущих экспресс-версиях. Есть ли другой способ уловить ошибки bodyParser()?

EDIT:

Это ошибка, когда тело запроса имеет недопустимый 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)
4b9b3361

Ответ 1

Хорошо, нашел:

bodyParser() - функция удобства для json(), urlencoded() и multipart(). Мне просто нужно вызвать json(), поймать ошибку и вызвать urlencoded() и multipart().

источник bodyParser

app.use (express.json ());
app.use (function (error, req, res, next){
    //Catch json error
    sendError (res, myCustomErrorMessage);
});

app.use (express.urlencoded ());
app.use (express.multipart ());

Ответ 2

Думаю, лучше всего проверить SyntaxError:

app.use(function (error, req, res, next) {
  if (error instanceof SyntaxError) {
    sendError(res, myCustomErrorMessage);
  } else {
    next();
  }
});

Ответ 3

Я обнаружил, что проверка на SyntaxError недостаточна, поэтому я:

if (err instanceof SyntaxError &&
  err.status >= 400 && err.status < 500 &&
  err.message.indexOf('JSON')) {
    // process filtered exception here
}