在URL路径中使用通配符的Node.js和Websocket

7
有没有适用于node.js的websocket框架,可以在websockets服务器路径中指定通配符?
我想使用以下路径:
/some/:id
在这种情况下,应该能够连接到与上述字符串匹配的URL。服务器可以访问ID并提供不同的通道。
例如:使用'module'时,可以为HTTP服务器设置特定路径的WebSocket服务器:
new WebSocket.Server({server: someHttpServer, path:'/some/path'})

从这里开始,您可以使用WebSocket对象从浏览器连接到您的WebSocket服务器:

let client = new WebSocket('ws://.../some/path')

我需要的是这样的东西。
new WebSocket.Server({server: someHttpServer, path:'/some/:id'})

所以我可以连接到WebSocket并传递预定义的ID。

let clientA = new WebSocket('ws://.../some/idA')
let clientB = new WebSocket('ws://.../some/idB')

我不确定我理解你的问题,但是Express允许您使用通配符提供不同的“路由”,其语法几乎与您建议的相同。 - Liam MacDonald
我编辑了问题,使其更具体。 - Stefan
2个回答

7

由于没有答案,我认为实际上是没有答案的。

我发现Websocket.Server类中的shouldHandle方法负责决定请求的websocket路径。可以轻松地进行覆盖,如下所示:

WebSocket.Server.prototype.shouldHandle = function shouldHandle(req) {
// Add your own logic and return `true` or `false` accordingly.
};

为了实现我想要的功能,您可以只需实施以下内容(不针对性能进行优化)

  ...
  let customShouldHandle (req) {
    const pattern = new require('url-patter')('/some/:key/path')
    const url = require('url').parse(req.url).pathname
    const match = pattern.match(url)
    
    if (!match) {
      return false
    }
    
    if (!req.params) {
      req.params = {}
    }
    req.params.key = match.key
    return true
  }
    
  ...
  let server = new WebSocket.Server({ 
    server: httpServer, 
    path: this.customShouldHandle 
  })
  ...

非常有用的答案! - Damaged Organic

2

按照原始的 ws 包教程,可以在多个套接字之间共享 HTTP(S) 服务器。

路由可以在 upgrade 回调中处理。

示例:

import { createServer } from 'http';
import { parse } from 'url';
import { WebSocketServer } from 'ws';

const server = createServer();
const wss1 = new WebSocketServer({ noServer: true });
const wss2 = new WebSocketServer({ noServer: true });

wss1.on('connection', function connection(ws) {
  // ...
});

wss2.on('connection', function connection(ws) {
  // ...
});

server.on('upgrade', function upgrade(request, socket, head) {
  const { pathname } = parse(request.url);

  if (pathname === '/foo') {
    wss1.handleUpgrade(request, socket, head, function done(ws) {
      wss1.emit('connection', ws, request);
    });
  } else if (pathname === '/bar') {
    wss2.handleUpgrade(request, socket, head, function done(ws) {
      wss2.emit('connection', ws, request);
    });
  } else {
    socket.destroy();
  }
});

server.listen(8080);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接