使用 ws,Node.js WebSocket 库,可以让多个服务器共享一个 HTTP/S 服务器。
是否可以对 socket.io 做同样的事情?
我需要在同一个 HTTP 服务器上有两台 WebSocket 服务器,一台用于 socket.io,另一台用于 Apollo 订阅。我可以使用 Websocket 服务器设置 Apollo 订阅服务器,但不适用于 socket.io,socket.io 只接受 HTTP 服务器。
我想在做这样的事情:
const socketioWsS = new WebSocket.Server({ noServer: true });
const graphqlWsS = new WebSocket.Server({ noServer: true });
const io = socketIo(socketioWsS, {
transports: ["websocket"]
});
server.on("upgrade", function upgrade(request, socket, head) {
const pathname = url.parse(request.url).pathname;
if (pathname === "/socket.io/") {
socketioWsS.handleUpgrade(request, socket, head, function done(ws) {
socketioWsS.emit("connection", ws, request);
});
} else if (pathname === "/graphql") {
graphqlWsS.handleUpgrade(request, socket, head, function done(ws) {
graphqlWsS.emit("connection", ws, request);
});
} else {
socket.destroy();
}
});
server.listen(config.app.port, () => {
...
new SubscriptionServer(
{
execute,
subscribe,
schema
},
{
server: graphqlWsS
}
);
});
它适用于 Graphql 订阅,但不适用于 socket.io。