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

部署于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,
});

验证操作

  1. 重启NestJS后端服务
  2. 访问http://<你的EC2公网IP>:3033/api打开Swagger UI
  3. 查看API请求地址已变为EC2公网IP,再次调用接口确认正常

内容的提问来源于stack exchange,提问作者Ashutosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:22:17