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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:02:42