【发布时间】:2019-04-10 08:59:23
【问题描述】:
有没有办法让单独的 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 server 行,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
【问题讨论】:
-
这不是应该完成的。我想让 socket.io 客户端连接到 socket.io 服务器,并且我想要一个 websocket 客户端连接到 websocket 服务器。我不是在寻找交叉沟通。
-
啊,那我误会了。所以问题是
ws不会将路径/aaaaa/socket.io上的套接字连接委托给socket.io? -
看起来
ws玩得很好,你必须manually implement theupgradeevent 让你的服务器根据路径委托给websocket服务器或socket.io -
实际上,与 /aaaaa/graphql 的 websocket 连接看起来非常好,只是 socket.io 端无法升级
-
@PatrickRoberts 嘿,成功了!它不像那个链接那样简单明了,但是手动处理升级事件是诀窍。非常感谢!
标签: node.js websocket socket.io apollo-server engine.io