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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:20:29