Heroku部署含WebSocket的Node.js应用持续出现请求超时错误求助
解决Heroku上Node.js WebSocket应用请求超时问题
先别急,你的问题大概率不是WebSocket库的问题,而是忽略了Heroku运行环境的一个关键细节——你的HTTP服务器没有处理普通的HTTP请求,导致Heroku路由层超时。让我帮你一步步排查解决:
为什么会触发超时?
Heroku的路由层会把所有外部请求(不管是普通HTTP还是WebSocket升级请求)都转发给你的应用。当你通过浏览器访问应用URL时,这是一个普通的HTTP GET请求,但你的http.createServer回调是空的,完全没给客户端返回任何响应。Heroku等不到响应,自然就会抛出超时错误。
另外,Heroku默认会对应用做健康检查(访问根路径),如果这个请求得不到响应,应用会被标记为不健康,进一步加重超时问题。
具体修复步骤
1. 给HTTP服务器加个基础响应
修改你的server.js,让它能处理普通HTTP请求,比如返回一个简单的提示:
const Socket = require("websocket").server const http = require("http") const server = http.createServer((req, res) => { // 处理普通HTTP请求,返回200状态码和提示信息 res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('WebSocket服务器已启动,请用WebSocket客户端连接哦~\n'); }) server.listen(process.env.PORT || 3000, () => { console.log(`Listening on port ${process.env.PORT || 3000}...`) }) const webSocket = new Socket({ httpServer: server }) webSocket.on('request', (req) => { const connection = req.accept() console.log("新的WebSocket连接已打开 🎉") connection.on('message', (message) => { try { const data = JSON.parse(message.utf8Data) if(data.type == "message"){ console.log("收到消息:", data.mess); connection.send(JSON.stringify(data)) } } catch (err) { console.error("解析消息出错:", err); connection.send(JSON.stringify({ type: "error", message: "无效的JSON格式哦" })); } }) // 别忘了处理连接关闭的情况 connection.on('close', (reasonCode, description) => { console.log("WebSocket连接已关闭:", reasonCode, description); }); })
2. 用正确的协议测试WebSocket
测试的时候别直接在浏览器地址栏输HTTP URL(比如https://your-app.herokuapp.com),那是普通HTTP请求,现在会收到正常响应;要测试WebSocket,得用对应的协议:
- 线上环境(HTTPS):
wss://your-app.herokuapp.com - 本地测试:
ws://localhost:3000
3. 查看Heroku日志排查问题
部署后,用Heroku CLI实时查看日志,确认服务器是否正常启动:
heroku logs --tail
你应该能看到Listening on port XXXX...的日志,还有WebSocket连接打开/关闭的记录,这能帮你快速定位其他潜在问题。
额外提醒
- Heroku的WebSocket连接默认30秒空闲就会断开,如果需要保持长连接,建议客户端和服务器每25秒左右发个心跳消息(比如空的JSON对象),避免被路由层强制断开。
- 确保
package.json里的start脚本正确,比如:
{ "scripts": { "start": "node server.js" }, "dependencies": { "websocket": "^1.0.34" } }
按照这些步骤改完,你的应用应该就能在Heroku上正常跑起来,不会再出现超时问题啦~
内容的提问来源于stack exchange,提问作者Amrit Gupta
相关产品推荐
相关产品推荐

