Nest.js+Flutter项目部署至Railway.app后WebSocket连接超时求助
解决Railway部署Nest.js WebSocket连接超时问题
问题根源
Railway平台的部署服务通过反向代理对外暴露,不会开放自定义端口(如你使用的5003),直接指定端口连接会被防火墙拦截,最终导致超时。另外,Railway默认启用HTTPS,WebSocket连接需对应使用wss://协议而非ws://。
修复步骤
1. 修改Nest.js Gateway配置
移除固定端口设置,让服务监听Railway分配的PORT环境变量端口,同时添加反向代理适配配置:
@WebSocketGateway({ path: '/', serveClient: false, cors: { origin: '*', // 生产环境建议指定具体合法域名 credentials: true, }, // 适配反向代理,让Nest识别真实请求来源 proxy: true, }) export class AppGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { prisma = new PrismaClient(); wsClients = []; @WebSocketServer() private server: Server; // 同时在main.ts中确保监听环境变量端口 // async function bootstrap() { // const app = await NestFactory.create(AppModule); // await app.listen(process.env.PORT || 3000); // } }
2. 调整Flutter端连接地址
使用Railway分配的域名,协议替换为wss://,无需手动指定端口:
// 错误写法 // final socket = WebSocket.connect('ws://website-live-nestjs-production.up.railway.app:5003'); // 正确写法 final socket = WebSocket.connect('wss://website-live-nestjs-production.up.railway.app');
3. 验证Railway服务配置
- 进入Railway项目的服务设置,确认未手动指定端口映射(Railway会自动处理端口转发)
- 确保服务启动命令正确(如
npm run start:prod),且项目能正常监听PORT环境变量指定的端口
额外注意事项
- 若WebSocket路径非根路径(
/),需在连接地址中补充对应路径,比如wss://xxx.up.railway.app/ws - 生产环境避免使用
origin: '*',应指定你的Flutter Web域名或移动端合法来源
内容的提问来源于stack exchange,提问作者mohamed hawas
相关产品推荐
相关产品推荐

