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)
Ответы
Ответ 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
}