Catch表示bodyParser错误

Gab*_*mas 39 javascript node.js express

我想在发送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 ();
    }
});
Run Code Online (Sandbox Code Playgroud)

但在我看来这是一个非常难看的方法,因为我正在比较可能在未来的快速版本中更改的错误消息.有没有其他方法来捕获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
}
Run Code Online (Sandbox Code Playgroud)

漂亮的印刷堆栈:

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)
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 22

我认为你最好的选择是检查SyntaxError:

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

  • 但是,如果请求体太大,则会出现Error而不是SyntaxError.例如:`{{错误:请求实体太大'类型:'entity.too.large',消息:'请求实体太大',statusCode:413,状态:413,预期:322350,长度:322350,限制: 102400}` (2认同)

Dan*_*rez 14

从@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();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我所做的只是:

app.use(bodyParser.json({ limit: '10mb' }))
// body parser error catcher
app.use((err, req, res, next) => {
  if (err) {
    res.status(400).send('error parsing data')
  } else {
    next()
  }
})
Run Code Online (Sandbox Code Playgroud)


Gab*_*mas 5

好的,找到它:

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 ());
Run Code Online (Sandbox Code Playgroud)

  • 那不是解决方案。您无需考虑在此代码可能是另一种中间件之前。如果以这种方式捕获某些异常,则可能导致不可预测的状态。至少最好这样写:`app.use(function(error,req,res,next){/ * Shutdown node * /}; app.use(bodyParser.json()); app.use(function(error, req,res,next){/ *如果err.status == 4 **,则处理json错误=&gt; res.status(400).send(),否则关闭节点* /});` (7认同)
  • 危险危险,如@Dao所说,这会捕获上述中间件中的任何错误。不安全 (7认同)