NestJS端到端测试请求返回404问题求助
NestJS E2E测试返回404状态码的排查与解决
以下是针对你遇到的E2E测试请求返回404问题的常见排查点和解决方案:
1. 核对控制器路由前缀配置
确认ProductsController的装饰器路由前缀与测试请求路径匹配:
- 如果控制器直接指定前缀:
// src/products/products.controller.ts @Controller('api/v1/products') // 或仅'products',取决于是否有全局前缀 export class ProductsController { @Post() create(@Body() createProductDto: CreateProductDto) { // 业务逻辑 } } - 如果主应用设置了全局前缀(如
api/v1):
此时测试请求路径应改为// src/main.ts async function bootstrap() { const app = await NestFactory.create(AppModule); app.setGlobalPrefix('api/v1'); await app.listen(3000); }/products,全局前缀会自动注入。
2. 同步测试应用与主应用的全局配置
测试中创建的应用实例需要和主应用保持一致的配置,比如全局前缀、中间件等:
// 在测试的beforeEach中添加 await app.init(); app.setGlobalPrefix('api/v1'); // 和主应用配置保持一致
3. 验证ProductsModule是否导出控制器
确保ProductsModule正确导出控制器,否则测试模块无法识别路由:
// src/products/products.module.ts @Module({ imports: [TypeOrmModule.forFeature([Product])], controllers: [ProductsController], exports: [ProductsController] // 必须导出控制器 }) export class ProductsModule {}
4. 检查请求路径的拼写与格式
确认请求路径的大小写、斜杠完全匹配控制器配置,NestJS路由区分大小写。
5. 打印注册路由验证
在测试中添加代码,打印应用所有注册路由,确认目标路由存在:
// 在beforeEach的app.init()之后添加 const server = app.getHttpServer(); const router = server._events.request._router; const routes = router.stack .filter(layer => layer.route) .map(layer => `${Object.keys(layer.route.methods).join(',')} ${layer.route.path}`); console.log('已注册路由:', routes);
运行测试后,查看控制台输出,确认POST /api/v1/products(或对应路径)是否在列表中。
内容的提问来源于stack exchange,提问作者Juanma De la Flor
相关产品推荐
相关产品推荐

