替换bodyParser.json为express.json后部分请求报500错误如何解决
问题根因
- 原实现中
bodyParser.json()仅作为路由级中间件挂载在需要JSON解析的POST接口上,其他不需要解析请求体的请求(比如示例中的GET请求)、以及接收非JSON格式请求体的接口不会执行JSON解析逻辑,不会触发解析报错。 - 改为全局挂载
express.json()后,所有请求无论请求方法、是否携带合法JSON格式的请求体,都会尝试执行JSON解析:当遇到无合法JSON请求体、请求体格式不符合JSON规范、或者请求头Content-Type与解析要求不匹配的请求时,中间件会抛出解析错误,如果你没有配置对应的错误捕获中间件,就会直接返回500错误。 - 补充说明:
express.json()本质就是Express 4.16.0版本之后内置封装的body-parser.json,本身API能力完全兼容,问题出在挂载范围的变化。
解决方法
方案1:沿用路由级挂载方式(改动最小、最稳妥)
直接用express.json()替换原有bodyParser.json()的引用即可,无需全局挂载,逻辑和原来完全一致不会影响其他接口:
import { Router } from "express"; // 删掉body-parser的引入 const jsonParser = express.json({ limit: "1mb", }); const apiRoutes: Router = Router(); // 路由配置和原逻辑完全一致 apiRoutes.post( "/:id", accessFilter, localDFilter, jsonParser, fetchProductData, );
方案2:保留全局挂载,补充兼容配置
如果你确实需要全局挂载JSON解析,需要补充两项配置避免不必要的报错:
- 限制解析范围,仅对需要JSON解析的请求生效:
// 只对/api开头的POST/PUT/PATCH请求执行JSON解析,跳过GET、OPTIONS等无请求体的请求 app.use('/api', (req, res, next) => { const parseMethods = ['POST', 'PUT', 'PATCH']; if (parseMethods.includes(req.method)) { return express.json({ limit: '1mb' })(req, res, next); } next(); });
- 新增全局错误处理中间件,捕获JSON解析错误,避免直接返回500:
// 放在所有路由配置之后的错误处理中间件 app.use((err, req, res, next) => { // 专门捕获body解析错误 if (err.type === 'entity.parse.failed') { return res.status(400).json({ code: 400, message: '请求体格式不符合要求' }); } // 其他错误走原有处理逻辑 next(err); });
内容的提问来源于stack exchange,提问作者Gutelaunetyp
相关产品推荐
相关产品推荐

