如何禁用Express的JSON解析并获取原始请求体?
获取Express JSON接口的原始请求体(Buffer/字符串)
核心问题原因
你的配置失效大概率是因为**express.json()中间件先于express.raw()被加载**——Express中间件按执行顺序处理请求,一旦express.json()解析了请求体,后续的raw中间件就无法获取原始数据了。
解决步骤
1. 移除全局JSON解析中间件
首先检查代码中是否存在全局的express.json()或bodyParser.json(),必须删除这些配置,否则原始请求体会被提前解析:
// 要删除的代码示例 // webhookApp.use(express.json()); // webhookApp.use(bodyParser.json());
2. 正确配置express.raw()中间件
根据需求选择全局或路由级配置,确保中间件在路由之前加载,且type参数匹配请求的Content-Type(支持字符串、正则表达式):
- 全局配置(所有JSON请求都返回原始Buffer):
// 匹配带charset后缀的application/json请求 webhookApp.use(express.raw({ type: /^application\/json/, limit: '1mb' // 根据需求设置请求体大小限制 })); - 路由级配置(仅针对特定接口):
webhookApp.post("/", express.raw({ type: /^application\/json/ }), (req, res) => { // req.body 现在是Buffer类型 const rawJsonString = req.body.toString('utf8'); // 后续处理逻辑 res.sendStatus(200); });
3. TypeScript类型适配
默认Express的Request类型不包含Buffer类型的body,可通过两种方式处理:
- 全局类型扩展(推荐,所有路由生效):
declare global { namespace Express { interface Request { body: Buffer; } } } - 局部类型断言(仅当前路由生效):
const rawBody = req.body as Buffer;
4. 额外排查点
- 检查是否有第三方中间件(如日志、认证中间件)提前解析了请求体;
- 确认请求头的
Content-Type确实为application/json; charset=utf-8,可通过req.get('content-type')在路由中验证。
内容的提问来源于stack exchange,提问作者tino415
相关产品推荐
相关产品推荐

