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

Socket.IO本地运行正常,部署至Heroku后出现GET请求错误求助

解决Heroku部署后Socket.io的GET请求错误

问题背景

你提到本地运行代码一切正常,但部署到Heroku后出现了Socket.io的GET请求错误,先来看下你提供的代码和错误信息:

服务端代码

app = express() 
app.listen(app.get('port'), function() { 
  console.log('Node app is running on port..', app.get('port')); 
}); 
var server = app.listen(4200); 
var io = require('socket.io')(server); 
io.on('connect',(socket)=>{ 
  console.log('connected..........'); 
})

客户端代码

private socket = io('My-Heroku-server-address:4200');

错误请求地址

https:My-Heroku-server-address:4200/socket.io/?EIO=3&transport=polling&t=MDpJszb

问题原因分析

这里有几个核心问题导致Heroku上请求失败:

  • Heroku动态端口限制:Heroku不会允许你硬指定4200端口,它会通过PORT环境变量分配随机可用端口,你单独开app.listen(4200)在Heroku环境下完全无法被外部访问。
  • 服务绑定冲突:你先让Express监听了app.get('port'),又重新创建了一个监听4200的server,这会导致Express主服务和Socket.io服务端口不一致,Socket.io的服务根本没跑在Heroku分配的对外端口上。
  • 客户端连接地址错误:Heroku的HTTPS服务默认使用443端口,你手动添加:4200会导致请求路径错误;另外,更稳妥的方式是用相对路径或完整HTTPS域名(不带端口)来连接。

修复方案

第一步:调整服务端代码

把Socket.io绑定到Express的主服务上,同时适配Heroku的动态端口:

const express = require('express');
const app = express();
// 本地开发用4200,Heroku环境自动读取PORT变量
const PORT = process.env.PORT || 4200;

// 将Express监听返回的server直接传给Socket.io
const server = app.listen(PORT, function() { 
  console.log('Node app is running on port..', PORT); 
}); 

const io = require('socket.io')(server); 
io.on('connect',(socket)=>{ 
  console.log('connected..........'); 
})

第二步:修改客户端连接方式

推荐使用相对路径(本地和部署环境通用),或者完整HTTPS域名(不带端口):

// 方式1:相对路径,自动适配当前域名和端口
private socket = io();

// 方式2:完整HTTPS域名(无需加端口)
private socket = io('https://My-Heroku-server-address');

这样修改后,部署到Heroku就能正常建立Socket.io连接了,本地开发时也能继续用4200端口运行,不用额外调整配置。

内容的提问来源于stack exchange,提问作者Deepak Dhull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:39