javascript - Websocket连接错误: returns 101,但不升级

标签 javascript node.js websocket ws

我正在使用 ws 库设置一些 websocket。我正在努力使用握手来设置授权。我已经添加了一条到我们服务器的路由来升级到 websocket 连接,如下所示:

    .get(
      '/chat',
    authorisationFunction,
    upgradeConnection,
    ),

WebSocket 服务器:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3030 }); 

这是upgradeConnection函数,如果授权成功就会运行:

const upgradeConnection = (request, socket, head) => {
  return wss.handleUpgrade(request, request.socket, head, function done(ws) {
    return wss.emit('connection', ws, request);
  });
}

我还有一个监听消息的函数:

function webSocketsServer() {
  wss.on('connection', (ws, request, client) => {
    ws.on('message', message => {
      ws.send(message);
    });
  });
}

发出连接,并从我的服务器得到以下响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: QyVvqadEcI1+ALka6j2pLKBkfNQ=

但随后我的客户端立即收到错误“与 'ws://localhost:3000/chat' 的 WebSocket 连接失败:无效的帧头”。

但是当我绕过握手并直接连接到我的 websocket 服务器时,我可以成功发送消息。该错误仅出现在客户端,而不出现在后端。我错过了什么?

最佳答案

我不是 100% 确定这是唯一的方法,但可能会有所帮助,所以我发布了它。 基于此answer我会选择使用相同端口进行 http 和 websocket 连接的服务器。 你可以这样实现:

const { createServer } = require('http')
const ws = require('ws')
const express = require('express')

const app = express()

const server = createServer(app)

app.get('/', (req, res) => {
  res.send('I am a normal http server response')
})

const wsServer = new ws.Server({
  server,
  path: '/websocket-path',
})

wsServer.on('connection', (connection) => {
  connection.send('I am a websocket response')
})

server.listen(3030, () => {
  console.log(`Server is now running on http://localhost:3030`)
  console.log(`Websocket is now running on ws://localhost:3030/<websocket-path>`)
})

因此,您的服务器会在端口 3030 上监听正常的 http 请求。如果它在路径“/websocket-path”上收到 Websocket 连接请求,则会将其传递到 ws 连接处理程序,然后您就可以开始了。

关于javascript - Websocket连接错误: returns 101,但不升级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62490269/

相关文章:

javascript - JavaScript/Node 中的数据模型定义标准

javascript - 通过新操作扩展 Node 应用程序

python - 有时会出现乱码结果,通过 TCP 套接字将 base64 编码图像从 python 发送到 node.js

javascript - 使用 Jquery 单击菜单链接时添加事件类

javascript - 触发脚本时刷新页面

javascript - 延迟 10-15 秒触发弹出窗口的最佳方法是什么?

angular - Docker nginx 代理 websocket 获取 404

javascript - 通过单击按钮删除子项

javascript - 为什么我的异步回调函数没有按顺序返回数据请求?

event-handling - WebSocket.onclose应该由用户导航或刷新触发吗?