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

Nest.js测试环境中createNestApplication的rawBody参数失效问题

Nest.js测试环境中rawBody未生效的问题排查与解决

问题背景

生产环境中,通过以下代码配置Nest应用可正常获取req.rawBody:

const app = await NestFactory.create(AppModule, {
  logger: logger,
  rawBody: true 
});

但在系统测试中,按如下方式创建测试实例后,控制器中req.rawBody始终为undefined:

const testingModule: TestingModule = await Test.createTestingModule({
  imports: [AppModule],
}).compile();

const app = testingModule.createNestApplication({ rawBody: true });

控制器代码:

public async webhook(@Req() req: RawBodyRequest, ...)

可能的原因与解决办法

1. Supertest自动解析请求体导致rawBody丢失

Supertest默认会自动解析JSON、form-data等格式的请求体,这会覆盖Nest保存的原始请求体。解决方法:

  • 发送请求时直接传递Buffer,并设置正确的Content-Type,避免Supertest提前解析:
const payload = { /* webhook请求体 */ };
await request(app.getHttpServer())
  .post('/webhook')
  .set('Content-Type', 'application/json')
  .send(Buffer.from(JSON.stringify(payload)))
  .expect(200);
  • 若使用form-data格式,可直接传递原始buffer并设置对应Content-Type。

2. 测试实例未正确初始化

确保测试实例完成初始化后再发起请求,添加await app.init():

const app = testingModule.createNestApplication({ rawBody: true });
await app.init(); // 新增初始化步骤

3. 显式配置bodyParser的verify函数

部分场景下,Nest的rawBody: true可能未正确触发bodyParser的verify逻辑,可手动配置确保原始buffer被赋值:

const app = testingModule.createNestApplication({
  rawBody: true,
  bodyParser: {
    json: {
      verify: (req, res, buf) => {
        req.rawBody = buf;
      },
    },
    urlencoded: {
      verify: (req, res, buf) => {
        req.rawBody = buf;
      },
    },
  },
});
await app.init();

排查是Nest.js还是Supertest的问题

方法1:绕过Supertest直接调用控制器

在测试中直接实例化控制器,手动构造RawBodyRequest对象并传入rawBody,验证控制器是否能正常获取:

const controller = testingModule.get(WebhookController);
const mockReq = {
  rawBody: Buffer.from('test raw body'),
  // 补充其他必要的req属性
} as unknown as RawBodyRequest;
await controller.webhook(mockReq);

若控制器能正常获取rawBody,说明问题出在Supertest;若仍为undefined,则是Nest测试实例的配置问题。

方法2:添加中间件检查rawBody

在测试实例中添加一个前置中间件,打印请求到达时的rawBody,判断丢失时机:

const app = testingModule.createNestApplication({ rawBody: true });
app.use((req, res, next) => {
  console.log('Middleware rawBody:', req.rawBody); // 查看是否存在
  next();
});
await app.init();
  • 若中间件中rawBody存在,控制器中不存在:说明后续中间件(如自定义全局中间件)覆盖了该属性
  • 若中间件中也不存在:说明Supertest未传递原始请求体,或Nest未正确保存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:05:22