使用Supertest测试NestJS项目时遭遇Request未定义错误
NestJS E2E测试中@Req()注入Request报错的解决办法
错误原因
根源是TypeScript类型引用出问题,常见两种情况:
- 控制器里用了
Request类型标注,但没从express正确导入; - 误把
Request类型当作值来使用(比如console.log(Request)),TypeScript编译时会移除类型定义,运行时自然找不到这个变量。
解决步骤
1. 正确导入Express的Request类型
在控制器文件开头加上类型导入:
import { Request } from 'express';
只把它当作类型标注使用,示例代码:
@Get('/test') testEndpoint(@Req() req: Request) { return { ip: req.ip }; }
注意:绝对不能把Request当值调用(比如new Request()),它只是TypeScript类型,编译后不会存在于运行代码中。
2. 检查E2E测试的TS配置
如果项目使用了单独的tsconfig.e2e.json,确保compilerOptions.types包含express:
{ "extends": "./tsconfig.json", "compilerOptions": { "types": ["jest", "node", "express"] } }
没有单独E2E配置的话,在根目录tsconfig.json的types数组中添加express即可。
3. 区分装饰器与类型
NestJS的@Req()(别名@Request())是装饰器,从@nestjs/common导入;而Request类型要从express导入,别混淆两者:
// 正确写法示例 import { Controller, Get, Req } from '@nestjs/common'; import { Request } from 'express'; @Controller() export class AppController { @Get() getHello(@Req() req: Request) { return req.path; } }
4. 补全依赖包
如果仍报错,大概率是缺少express的类型定义包,执行安装命令:
yarn add -D @types/express
验证方法
新建空白Nest项目,按上述步骤编写控制器和E2E测试用例,运行yarn test:e2e,确认错误不再出现。
内容的提问来源于stack exchange,提问作者Ferenc T
相关产品推荐
相关产品推荐

