gpt4 book ai didi

node.js - 独立 websocket 服务器出现 Socket.io "Invalid frame header"错误

转载 作者:太空宇宙 更新时间:2023-11-03 21:51:41 24 4
gpt4 key购买 nike

有没有办法让单独的 websocket 服务器与不同路径上的 socket.io 一起工作?

let http = require('http');
let express = require('express');
let socketio = require('socket.io');
let websocket = require('ws');

let httpServer = http.createServer();

let expressApp = express();
httpServer.on('request', expressApp);

let socketioServer = socketio(httpServer, { path: '/aaaaa/socket.io/' });
socketioServer.of('/').on('connect', () => {});

let websocketServer = new websocket.Server({ server: httpServer, path: '/aaaaa/graphql' });

httpServer.listen(2233, () => console.log('started'));

我看到的行为是,当创建一个单独的 websocket 服务器时,socket.io 仍然可以正常工作,但不会升级到 websocket 的连接,并且失败并出现错误(来自 chrome) ):

WebSocket connection to 'ws://localhost:2233/aaaaa/socket.io/?EIO=3&transport=websocket&sid=fx4pOT0cegz65JMCAAAB' failed: Invalid frame header

需要明确的是,如果省略 websocket 服务器行,socket.io 可以正常工作。

我的具体用例是,启用订阅时,apollo-server-express 包会创建一个 websocket 服务器。有没有办法以更友好的方式配置 socket.io ?或者,我相信我可以提供一个 websocket 服务器供 apollo 使用,而不是创建一个......我将如何创建它?

用于复制的软件包版本:

node       8.11.1
express 4.16.4
socket.io 2.1.1
ws 6.1.0

最佳答案

如果这对其他人有帮助,这是我的派生解决方案:

let [socketioUpgradeListener, apolloUpgradeListener] = httpServer.listeners('upgrade').slice(0);
httpServer.removeAllListeners('upgrade');
httpServer.on('upgrade', (req, socket, head) => {
const pathname = url.parse(req.url).pathname;
if (pathname == '/aaaaa/socket.io/')
socketioUpgradeListener(req, socket, head);
else if (pathname == '/aaaaa/graphql')
apolloUpgradeListener(req, socket, head);
else
socket.destroy();
});

有点烦人,因为在我搞乱它们之前,两个库都已经完全初始化了它们的 websocket 服务器,并带有大量的事件监听器。但是,我可以挑选 'upgrade' 监听器并手动委托(delegate)它们。当然,这并不完美,因为它对初始化顺序和新监听器敏感,但它足以满足我的用例。

如果此解决方案有任何明显的缺陷或 Websocket 服务器委托(delegate)有任何其他细微差别,请告诉我。

关于node.js - 独立 websocket 服务器出现 Socket.io "Invalid frame header"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53180854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com