Node.js WebSocket API部署到Heroku后无法正常运行如何解决
Heroku部署WebSocket服务无法连接的修复方案
核心故障原因
- 协议不匹配:Heroku为所有应用默认提供HTTPS接入,对应WebSocket连接必须使用加密的
wss://协议,直接替换HTTPS前缀为ws://发起的非加密连接会被Heroku路由层拦截,同时浏览器也会阻止HTTPS站点发起非加密WebSocket请求。 - 代码缺失依赖引入:你贴出的代码未引入Node.js内置
http模块,也未引入WebSocket服务对应的依赖包,部署环境下会直接抛出变量未定义错误导致服务启动失败。 - 启动配置缺失:如果项目未配置正确的启动脚本,Heroku无法正常拉起你的Node服务。
修复步骤
- 调整前端连接地址:将WebSocket连接地址从
ws://<project-name>.herokuapp.com改为wss://<project-name>.herokuapp.com即可,Heroku路由层会自动处理TLS证书终结,后端不需要额外配置SSL证书。 - 补全后端代码的依赖引入,修正服务初始化逻辑,完整可运行的
web.js代码如下:
const http = require('http'); const express = require('express'); const { server: SocketServer } = require('websocket'); const app = express(); const port = process.env.PORT || 3000; // 传入express实例兼容HTTP请求,比如后续提供静态前端页面 const server = http.createServer(app); server.listen(port, () => { console.log("Listening on port ", port) }) const wsServer = new SocketServer({httpServer: server}) const connections = [] wsServer.on('request', (req) => { const connection = req.accept() console.log('new connection') connections.push(connection) connection.on('message', (mes) => { connections.forEach(element => { if (element != connection) { element.send(mes.utf8Data) } }) }) connection.on('close', (resCode, des) => { console.log('connection closed') connections.splice(connections.indexOf(connection), 1) }) })
- 安装代码依赖,执行以下命令:
npm install express websocket
- 检查项目根目录的
package.json,确保包含正确的依赖声明和启动脚本,参考配置如下:
{ "name": "simple-ws-service", "version": "1.0.0", "dependencies": { "express": "^4.18.2", "websocket": "^1.0.34" }, "scripts": { "start": "node web.js" } }
注意:不要手动写死服务监听端口,必须使用
process.env.PORT读取Heroku动态分配的端口,你原有代码的端口逻辑是正确的,不需要修改。
- 提交修改后的代码,重新执行
git push heroku master完成部署即可。
内容的提问来源于stack exchange,提问作者Ankit Kumar Maurya
相关产品推荐
相关产品推荐

