如何设置快递websocket服务器的路由?

我有一个类似于这个的设置:

var WebSocketServer = require("ws").Server, express = require("express"), http = require("http"), app = express(), server = http.createServer(app); app.post("/login", login); app.get("/...", callSomething); // ... server.listen(8000); var wss = new WebSocketServer({server: server}); wss.on("connection", function(ws){ // ... }); 

我想把WebSocketServer放在特定的path下,例如"...com/whatever" 。 问题是如何设置path? 可能吗?

您将需要使用path选项:

 var wss = new WebSocketServer({server: server, path: "/hereIsWS"}); 

请参阅完整的文档

使用express-ws: https : //www.npmjs.com/package/express-ws

安装:

 npm i express-ws -S 

代码示例:

 const express = require('express') const enableWs = require('express-ws') const app = express() enableWs(app) app.ws('/echo', (ws, req) => { ws.on('message', msg => { ws.send(msg) }) ws.on('close', () => { console.log('WebSocket was closed') }) }) 

接受的答案不再有效,并会抛出Frame Header Invalid错误。 请求#885 。

WSpath被删除,如Lpinca所说:

这里的问题是,每个WebSocketServer都会为HTTP服务器上的升级事件添加一个新的侦听器,并且在发出该事件时,会在所有服务器上调用handleUpgrade。

这是周围的工作:

 const wss1 = new WebSocket.Server({ noServer: true }); const wss2 = new WebSocket.Server({ noServer: true }); const server = http.createServer(); server.on('upgrade', (request, socket, head) => { const pathname = url.parse(request.url).pathname; if (pathname === '/foo') { wss1.handleUpgrade(request, socket, head, (ws) => { wss1.emit('connection', ws); }); } else if (pathname === '/bar') { wss2.handleUpgrade(request, socket, head, (ws) => { wss2.emit('connection', ws); }); } else { socket.destroy(); } });