NestJS + Socket.IO应用部署Heroku端口问题求助
解决NestJS + Socket.IO部署Heroku的端口问题
核心原因
Heroku仅允许应用监听一个动态分配的端口(通过process.env.PORT环境变量获取),所有HTTP、WebSocket请求都必须通过这个端口路由。本地环境无端口限制可多端口运行,但Heroku容器网络只暴露这一个端口,额外端口无法被外部访问。
解决方案步骤
1. 统一使用Heroku分配的端口
修改网关配置,取消手动指定端口,让Socket.IO复用HTTP服务的端口:
import { WebSocketGateway, WebSocketServer, OnGatewayInit } from '@nestjs/websockets'; import { Server } from 'socket.io'; @WebSocketGateway({ cors: { origin: "*", // 生产环境建议替换为你的前端域名 credentials: true, }, // 移除port配置,自动复用HTTP服务端口 }) export class AppGateway implements OnGatewayInit { @WebSocketServer() server: Server; afterInit(server: Server) { console.log('Socket.IO服务初始化完成'); } }
2. 确保HTTP服务绑定动态端口
修改main.ts,让应用监听Heroku分配的端口:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors({ origin: "*", // 生产环境指定具体域名 credentials: true, }); await app.listen(process.env.PORT || 3000); // 本地开发 fallback 3000,生产用Heroku端口 } bootstrap();
3. 修正客户端连接配置
客户端连接时无需指定额外端口,直接使用Heroku应用域名,默认路径为/socket.io:
// 客户端示例代码 const socket = io('https://你的Heroku应用域名.herokuapp.com', { transports: ['websocket', 'polling'], // 优先WebSocket,降级轮询适配网络 });
4. 检查Heroku部署配置
- 确保
Procfile配置正确,指向生产启动命令:web: npm run start:prod - 用
heroku logs --tail查看实时日志,排查是否有端口绑定失败、Socket.IO初始化错误等信息
404错误排查要点
如果共用端口出现404,可能是以下原因:
- Socket.IO路径不匹配:若网关指定了
path(如path: '/ws'),客户端需同步配置{ path: '/ws' } - 全局前缀冲突:若应用设置了
app.setGlobalPrefix('api'),Socket.IO路径不受影响,但需确保客户端未错误添加前缀 - 依赖版本问题:确认
@nestjs/websockets、socket.io版本兼容,避免因版本差异导致路由异常
内容的提问来源于stack exchange,提问作者Kareem Adel
相关产品推荐
相关产品推荐

