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

NestJS本地CORS正常,部署至Railway后出现CORS错误求助

解决NestJS(Fastify)部署到Railway后的CORS错误

问题核心

本地测试正常但部署后触发CORS错误,本质是Fastify适配器下的CORS配置逻辑与Express存在差异,再加上平台环境变量、插件执行顺序的叠加影响。

修复方案

1. 改用Fastify官方CORS插件

NestJS原生的enableCors()在Fastify环境下优先级较低,建议直接使用@fastify/cors插件配置:

  • 安装依赖:
npm install @fastify/cors
  • 修改启动代码:
import cors from '@fastify/cors';

(async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter(),
  );
  await app.register(contentParser);
  await app.register(helmet);
  
  // 先注册CORS插件,放在csrf之前
  const config = app.get(ConfigService);
  const client = config.getOrThrow(CLIENT);
  await app.register(cors, {
    origin: client,
    credentials: true, // 前端携带认证头或cookie时必须开启
    allowedHeaders: ['Content-Type', 'Authorization'], // 适配GraphQL请求头
    methods: ['GET', 'POST', 'OPTIONS'],
  });
  
  // 让CSRF插件跳过OPTIONS预检请求
  await app.register(fastifyCsrf, {
    ignoreMethods: ['OPTIONS'],
  });

  // 全局管道、过滤器配置保持不变...

  const port = config.get('PORT') || 3000;
  // 绑定0.0.0.0确保Railway能访问服务
  await app.listen(port, '0.0.0.0');

  const logger = new Logger('Bootstrap');
  logger.log(`CORS允许的源: ${client}`);
  logger.log(`服务运行在端口: ${port}`);
})();

2. 校验Railway环境变量

  • 确认Railway后台的CLIENT环境变量值为前端部署后的完整HTTPS域名(如https://your-frontend.railway.app),不要带末尾斜杠
  • 查看Railway启动日志,确认CORS允许的源输出与前端域名完全一致

3. 调整服务监听地址

在app.listen()中添加'0.0.0.0'参数,确保服务绑定到所有可用网络接口,避免Railway无法访问服务:

await app.listen(port, '0.0.0.0');

验证步骤

部署后打开浏览器控制台,查看Network面板:

  • 检查OPTIONS预检请求的响应头是否包含Access-Control-Allow-Origin,值与前端域名匹配
  • 确认GraphQL的POST请求没有CORS报错

内容的提问来源于stack exchange,提问作者Mhmd Al-Rshedy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:40