首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接到Heroku中的websocket服务器

问无法连接到Heroku中的websocket服务器
EN

Stack Overflow用户
提问于 2021-08-16 08:59:27
回答 1查看 249关注 0票数 0

我有一个在Heroku上运行的Node.js服务器。它在其他方面工作得很好,但客户端无法连接websocket。

尝试连接到websocket时,第一个http get请求完成,状态为200 OK。服务器日志显示已发出路由"/“的请求,但之后没有任何请求。我不确定websocket服务器是否在运行。

客户端代码(使用React构建):

代码语言:javascript
复制
this.ws = new WebSocket('wss://totentanz.herokuapp.com/');

服务器代码(使用Express和Node.js构建):

代码语言:javascript
复制
const express = require('express')
const app = express()
const port = process.env.PORT || 3002
const cors = require('cors')

app.use(express.json())
app.listen(port, () => {
  console.log(`Server started!`)
})

app.use(cors());

app.get('/', (req, res) => { res.send('Hello World') })

const { Server } = require('ws');
const wss = new Server({ server: app })
wss.on('connection', function connection(ws) {
 console.log("New connection")
...
})

错误消息:

代码语言:javascript
复制
WebSocket connection to 'wss://totentanz.herokuapp.com/' failed:
Event {isTrusted: true, type: "error", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
bubbles: false
cancelBubble: false
cancelable: false
composed: false
currentTarget: WebSocket {url: "wss://totentanz.herokuapp.com/", readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
defaultPrevented: false
eventPhase: 0
isTrusted: true
path: []
returnValue: true
srcElement: WebSocket {url: "wss://totentanz.herokuapp.com/", readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
target: WebSocket {url: "wss://totentanz.herokuapp.com/", readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
timeStamp: 1077.5999999940395
type: "error"
[[Prototype]]: Event

如果我尝试创建带有端口的WebSocket服务器,它当然会失败,因为那时http和ws服务器都使用相同的端口。在Heroku中,不可能使用多个端口。

有没有办法确认ws服务器正在运行?这里会有什么问题呢?

编辑:我已经发现了问题,但我还不明白为什么会发生这种情况。这是可行的:

代码语言:javascript
复制
const server = express()
.use(cors)
.use(express.json())
.listen(PORT, () => console.log(`Listening on ${PORT}`))

这不是:

代码语言:javascript
复制
const server = express()
server.use(cors)
server.use(express.json())
server.listen(PORT, () => console.log(`Listening on ${PORT}`))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-16 20:10:34

我找到了一个名为express-ws的模块。它解决了问题。现在,工作代码如下所示:

代码语言:javascript
复制
const express = require('express');
const PORT = process.env.PORT || 3000;
const cors = require('cors')
const app = express()
const expressWs = require('express-ws')(app);

app
  .use(express.json())
  .listen(PORT, () => console.log(`Listening on ${PORT}`));
app.use(cors())
app.get('/', (req, res) => { res.send('Hello World') })
...
app.ws('/', function (ws, req) {
  ws.on('message', function (rawdata) {
...
expressWs.getWss().clients.forEach(function each(client) {
...
})
}})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68799988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档