部署于AWS EC2的NestJS后端Swagger API调用遇CORS错误
NestJS后端Swagger调用API出现Failed to fetch问题解决
问题概述
- AWS EC2(Amazon Linux t2.micro)上部署的NestJS后端,通过公网IP可正常访问Swagger UI,但调用API时提示
Failed to fetch - EC2实例内部用
curl测试API完全正常,仅Swagger UI发起请求时出错 - 请求目标URL为
http://localhost:3033/api/v1/auth/signin - 环境:Swagger 6.0.5、Node.js最新版、NestJS CORE 9.0.0
核心原因
Swagger UI默认使用localhost:3033作为API请求地址,但你是通过EC2公网IP访问Swagger UI,浏览器会把localhost解析为你的本地机器,而非EC2后端服务器,导致请求无法到达目标,同时触发跨域相关错误。
解决方案
1. 修正Swagger服务器地址配置
在NestJS的main.ts中,为Swagger添加EC2公网IP作为服务器地址,让Swagger UI发起请求时指向正确的后端:
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; const swaggerConfig = new DocumentBuilder() .setTitle('API服务') .setDescription('接口文档') .setVersion('1.0') // 替换为你的EC2公网IP .addServer('http://<你的EC2公网IP>:3033') .build(); const apiDocument = SwaggerModule.createDocument(app, swaggerConfig); SwaggerModule.setup('api', app, apiDocument);
2. 确保后端监听所有网卡
避免后端仅监听localhost,修改main.ts的监听配置,让服务接受来自外部的请求:
// 替换原有的localhost,改为0.0.0.0监听所有网卡 await app.listen(3033, '0.0.0.0');
3. 确认CORS配置有效性
如果生产环境需要严格控制跨域来源,更新CORS配置允许Swagger UI的访问地址:
app.enableCors({ // 生产环境建议替换为具体的公网IP或域名,而非通配符 origin: 'http://<你的EC2公网IP>:3033', credentials: true, });
验证操作
- 重启NestJS后端服务
- 访问
http://<你的EC2公网IP>:3033/api打开Swagger UI - 查看API请求地址已变为EC2公网IP,再次调用接口确认正常
内容的提问来源于stack exchange,提问作者Ashutosh
相关产品推荐
相关产品推荐

