当我发送一个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 ();
}
});
但在我看来这是一个非常难看的方法,因为我正在比较可能在未来的快递版本中发生变化的错误信息。还有其他方法可以捕获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)
答案 0 :(得分:20)
我认为最好的办法是检查SyntaxError
:
app.use(function (error, req, res, next) {
if (error instanceof SyntaxError) {
sendError(res, myCustomErrorMessage);
} else {
next();
}
});
答案 1 :(得分:11)
来自@alexander的答案,但有一个使用示例
app.use((req, res, next) => {
bodyParser.json({
verify: addRawBody,
})(req, res, (err) => {
if (err) {
console.log(err);
res.sendStatus(400);
return;
}
next();
});
});
function addRawBody(req, res, buf, encoding) {
req.rawBody = buf.toString();
}
答案 2 :(得分:4)
好的,找到了:
bodyParser()是json(),urlencoded()和multipart()的便捷函数。我只需要调用json(),捕获错误并调用urlencoded()和multipart()。
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 ());
答案 3 :(得分:3)
我所做的只是:
$(".next").click(function() {
if (animating) return false;
animating = true;
current_fs = $(this).parent();
next_fs = $(this).parent().next();
//activate next step on progressbar using the index of next_fs
$("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");
答案 4 :(得分:1)
我发现检查SyntaxError
是不够的,所以我这样做:
if (err instanceof SyntaxError &&
err.status >= 400 && err.status < 500 &&
err.message.indexOf('JSON')) {
// process filtered exception here
}
答案 5 :(得分:0)
创建新模块“hook-body-parser.js” 将所有内容与正文解析器挂钩
const bodyParser = require("body-parser");
module.exports = () => {
return [
(req, res, next) => {
bodyParser.json()(req, res, (error) => {
if (error instanceof SyntaxError) {
res.sendStatus(400);
} else {
next();
}
});
},
bodyParser.urlencoded({ extended: true }),
];
};
并像这样使用 over express
... app.use(hookBodyParser()) ...
答案 6 :(得分:0)
从 1.18.0 版本开始,所有错误都包含一个类型属性。对于解析失败,err.type === 'entity.parse.failed'。
app.use(function (error, req, res, next) {
if (error.type === 'entity.parse.failed') {
sendError(res, myCustomErrorMessage);
} else {
next();
}
});
答案 7 :(得分:-1)
(bodyParser, req, res) => new Promise((resolve, reject) => {
try {
bodyParser(req, res, err => {
if (err instanceof Error) {
reject(err);
} else {
resolve();
}
});
} catch (e) {
reject(e);
}
})
防弹。未来的感知。 WTFPL许可。并且有用w / async / await。