Tre*_*son 5 websocket node.js socket.io engine.io apollo-server
有没有办法让单独的 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'));
Run Code Online (Sandbox Code Playgroud)
我看到的行为是,当创建一个单独的 websocket 服务器时,它socket.io仍然可以正常运行,但不会升级到 websocket 的连接并且失败并出现错误(来自 chrome):
WebSocket connection to 'ws://localhost:2233/aaaaa/socket.io/?EIO=3&transport=websocket&sid=fx4pOT0cegz65JMCAAAB' failed: Invalid frame header
Run Code Online (Sandbox Code Playgroud)
需要明确的是,如果省略 websocket 服务器行,则socket.io可以正常工作。
我的具体用例是apollo-server-express在启用订阅时由包创建一个 websocket 服务器。有没有办法以socket.io更友好的方式进行配置?或者,我相信我可以为 apollo 提供一个 websocket 服务器来使用而不是创建一个……我将如何创建它?
用于复制的软件包版本:
node 8.11.1
express 4.16.4
socket.io 2.1.1
ws 6.1.0
Run Code Online (Sandbox Code Playgroud)
如果这对其他人有帮助,这是我的派生解决方案:
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();
});
Run Code Online (Sandbox Code Playgroud)
有点烦人,因为在我弄乱它们之前,两个库都已经完全初始化了它们的 websocket 服务器,并带有大量的事件侦听器。但是,我可以挑选'upgrade'听众并手动委派他们。当然,这并不完美,因为它对初始化顺序和新侦听器敏感,但它足以满足我的用例。
如果此解决方案有任何明显的缺陷或 websocket 服务器委托有任何其他细微差别,请告诉我。
| 归档时间: |
|
| 查看次数: |
3258 次 |
| 最近记录: |