Heroku部署Node.js uWebsockets.js出现R10错误无法绑定$PORT
问题根因
- uWebSockets.js的
listen方法参数顺序和标准Node.js HTTP服务存在差异:若要指定监听主机,正确参数顺序为listen(主机地址, 端口号, 回调函数),你的代码写反了端口和主机的位置,导致服务并未实际绑定到Heroku分配的$PORT上。日志中打印的是你自定义的port变量值,并非服务实际绑定的端口,因此出现了日志显示监听成功但实际未绑定的假象。 - 你的当前服务仅配置了WebSocket路由,未处理普通HTTP请求,Heroku负载均衡的健康检查会发送HTTP请求验证服务可用性,即便端口绑定成功,也可能因健康检查无响应被判定为启动失败。
解决方案
1. 修改server.js代码
调整listen参数顺序,同时新增根路径的HTTP路由响应健康检查:
const uWS = require('uWebSockets.js'); const port = process.env.PORT || 9001; const host = '0.0.0.0' const app = uWS.App() // 新增HTTP根路由响应Heroku健康检查 .get('/', (res, req) => { res.end('ok') }) .ws('/*', { maxPayloadLength: 16 * 1024 * 1024, idleTimeout: 160, }) // 调整参数顺序:主机在前,端口在后 .listen(host, port, (token) => { if (token) { console.log('Listening to port ' + port); } else { console.log('Failed to listen to port ' + port); } });
如果你不需要指定特定监听地址,也可以省略host参数,uWS默认会监听0.0.0.0,直接写.listen(port, (token) => { ... })即可。
2. 可选优化Dockerfile
Heroku会自动忽略Dockerfile中的EXPOSE指令,你可以删除该行避免冗余,不会影响正常部署。
修改后重新部署即可解决R10错误。
内容的提问来源于stack exchange,提问作者manjunatha bairi
相关产品推荐
相关产品推荐

