Heroku部署Node.js+PHP项目的Socket.IO WS服务器出现404错误求助
解决方案
1. 修复服务端路由拦截逻辑
你当前配置的全局中间件会拦截所有请求直接返回index2.php,导致Socket.IO专用的/socket.io/*路径请求无法被正常处理,直接返回404。需要调整路由规则,仅将根路径/指定路径的请求返回PHP文件:
// 原错误写法:所有请求都返回index2.php // .use((req, res) => res.sendFile(INDEX, { root: __dirname })) // 修正写法:仅匹配根路径的GET请求返回文件 .get('/', (req, res) => res.sendFile(INDEX, { root: __dirname }))
2. 补全Socket.IO跨域配置
由于你采用Node.js服务+PHP后端的分离架构,需要在服务端配置跨域规则,允许PHP前端域名的访问请求:
// 修正io初始化逻辑 const io = socketIO(server, { cors: { origin: "你的PHP前端部署域名", // 生产环境请替换为实际域名,测试阶段可临时写"*" credentials: true } });
3. 修正客户端连接状态判断逻辑
Socket.IO的连接是异步操作,初始化实例后立即判断connected状态必然返回false,需改为监听connect事件处理连接成功后的逻辑:
var socket = io("https://xamchat.herokuapp.com/", {withCredentials: true}); // 监听连接成功事件 socket.on('connect', () => { alert("connected"); socket.emit("connection"); socket.on('time', function(data) { console.log(data); }); }); // 可增加连接失败监听方便排查问题 socket.on('connect_error', (err) => { console.error('连接失败错误信息:', err); alert("not connected"); });
4. 检查Heroku部署配置
确认项目根目录下的Procfile文件配置正确,启动命令指向你的WS服务入口文件,示例如下:
web: node server.js
请将server.js替换为你实际的服务端文件名。
内容的提问来源于stack exchange,提问作者Xam Mlr
相关产品推荐
相关产品推荐

