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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:19:08