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

如何扩展body-parser的IncomingRequest类型添加rawBody属性?

问题原因

你写的类型声明不生效,核心是三个问题:

  • 模块声明写法错误:declare module http没有给模块名加引号,TS会把它识别为自定义全局命名空间,不会关联到Node.js内置的http模块类型
  • 类型合并逻辑错误:扩展已有类型需要用interface做声明合并,你写的export class IncomingMessage会被识别为全新的独立类型,不会给原有类型追加属性
  • 未确认TS扫描范围:如果types.d.ts没有被tsconfig.json的include配置覆盖,TS根本不会加载这个声明文件
解决步骤
  • 检查tsconfig.json的include配置,确保你的声明文件在扫描范围内,比如常见配置:
{
  "include": ["src/**/*", "types/**/*", "*.d.ts"]
}

如果types.d.ts放在项目根目录,上面配置里的*.d.ts就会覆盖到它。

  • 替换types.d.ts里的内容,同时扩展Express Request和http IncomingMessage类型,既兼容express.json配置中verify回调的赋值场景,也适配后续路由、其他中间件里读取rawBody的场景:
declare global {
  namespace Express {
    interface Request {
      rawBody?: Buffer;
    }
  }
}

declare module 'http' {
  interface IncomingMessage {
    rawBody?: Buffer;
  }
}

注意:如果你的声明文件顶部存在import/export语句成为ES模块,上面的写法可直接使用;如果是无导入导出的纯全局声明文件,去掉外层的declare global包裹即可。

  • 清除TS服务缓存,写完声明后重启TS语言服务,比如VSCode中按快捷键Ctrl+Shift+P(macOS为Cmd+Shift+P),选择TypeScript: Restart TS Server即可生效。
效果验证

修改完成后,原有express.json配置中的req.rawBody = buf赋值不会再报Property 'rawBody' does not exist on type 'IncomingMessage'.ts(2339)错误,后续在路由处理函数、其他自定义中间件中读取req.rawBody时,TS也能正常识别为Buffer类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:24:25