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
相关产品推荐
相关产品推荐

