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
相关产品推荐
相关产品推荐

