Express框架中第三方中间件抛出错误的最佳处理方案是什么?
body-parser 错误处理最佳实践
body-parser 抛出的所有错误实例本身已经内置了明确的statusCode属性和type标识,不需要手动维护错误映射规则,直接在全局错误处理中间件中优先使用错误自带的属性即可,修改后的代码如下:
const express = require('express') const bodyParser = require('body-parser') const app = express() app.use(bodyParser.urlencoded({ extended: false })) // 其他中间件、路由逻辑 app.get(/* 你的路由定义 */) // 所有自定义路由 // 全局错误处理中间件 app.use(function (err, req, res, next) { console.error(err.stack) // 优先使用错误实例自带的状态码,不存在则默认返回500 const resStatusCode = err.statusCode || 500 // 客户端错误直接返回官方给出的错误提示,服务端错误隐藏细节 const resMsg = resStatusCode < 500 ? err.message : 'Something broke!' res.status(resStatusCode).send(resMsg) }) app.listen(9000)
方案说明
body-parser 已经对常见错误做了内置处理:
- 请求负载过大错误:自带
statusCode: 413,错误类型为entity.too.large - 请求解析格式错误:自带
statusCode: 400,错误类型为entity.parse.failed - 客户端断开连接类错误:自带
statusCode: 400/408,无需额外判断
所有错误标识都是官方内置,跟随版本迭代自动更新,不需要你手动维护适配逻辑。
你提到的几种方案的弊端
- 第三方中间件后加自定义捕获中间件:冗余度高,项目引入多个解析中间件时每个都要单独加,维护成本高
- try-catch 包裹第三方中间件:Express 中间件抛出的错误会自动向下传递到错误处理中间件,手动包裹反而容易漏掉异步错误
- 手动写 switch case 适配:需要跟着第三方中间件的版本同步更新错误映射规则,容易出现遗漏和适配错误
内容的提问来源于stack exchange,提问作者Naor Tedgi
相关产品推荐
相关产品推荐

