You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express.js/Mongoose如何捕获API请求中的JSON语法错误?

解决Express.js接收格式错误JSON时崩溃的问题

我刚碰到过一模一样的坑!本质是body-parser中间件在解析无效JSON时会抛出未捕获的SyntaxError,如果没做处理就会直接导致整个应用崩溃。下面给你两种简单有效的解决方式:

方法一:添加全局错误处理中间件

Express支持定义四参数的错误处理中间件(必须是err, req, res, next四个参数),把它放在所有路由和其他中间件的后面,就能专门捕获这类漏网的错误。

代码示例

在你的Express应用初始化代码里,等所有路由定义完成后,添加这段代码:

// 全局错误处理中间件,务必放在所有路由之后
app.use((err, req, res, next) => {
  // 精准判定是否为JSON解析错误
  if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
    console.error('JSON格式错误详情:', err.message);
    // 返回友好的错误提示给客户端
    return res.status(400).json({ 
      success: false,
      error: '请求体JSON格式无效,请检查后重试' 
    });
  }
  // 其他类型的错误交给Express默认处理(也可以自定义其他逻辑)
  next(err);
});

原理说明

body-parser解析失败时抛出的SyntaxError,自带status:400和body属性,我们通过这几个特征精准定位这类错误,返回400状态码和友好提示,就能避免应用崩溃。

方法二:包装body-parser中间件(自定义解析错误逻辑)

如果你想更精细化控制body-parser的错误处理流程,可以直接包装它的JSON解析中间件,在解析失败时即时处理:

const bodyParser = require('body-parser');

// 自定义包装的JSON解析中间件
app.use((req, res, next) => {
  bodyParser.json()(req, res, (parseErr) => {
    if (parseErr) {
      console.error('JSON解析失败:', parseErr.message);
      return res.status(400).send('请求JSON格式错误');
    }
    // 解析成功,继续执行后续路由
    next();
  });
});

额外优化提示

你的测试路由里,res.sendStatus(204)之后调用next()是多余的——因为sendStatus已经发送了响应,后续的next()会导致Express尝试处理已经结束的请求,可能引发不必要的警告,建议去掉:

private routeTest() { 
  this.router.post('/test', (req, res) => { 
    console.log('testing');
    res.sendStatus(204); 
    // 移除这里的next()
  });
}

现在你再用Postman发送格式错误的JSON(比如{"key": "value", }这种末尾带逗号的),应用就不会崩溃,而是返回你定义的错误提示啦!

内容的提问来源于stack exchange,提问作者Ezeon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:29:08