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
相关产品推荐
相关产品推荐

