url 路径中带有通配符的 Node.js 和 Websocket

Posted

技术标签:

【中文标题】url 路径中带有通配符的 Node.js 和 Websocket【英文标题】:Node.js and Websocket with wildcard in url path 【发布时间】:2017-03-31 12:40:39 【问题描述】:

是否有适用于 node.js 的 websocket 框架,我可以在其中指定 websockets 服务器路径中的通配符?

我想使用这样的路径

/some/:id

在这种情况下,应该能够连接到与上述字符串匹配的 url。服务器可以访问 id 并且可以为不同的频道提供服务。

例如:当使用模块 'ws' 时,可以为 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 允许您使用通配符提供不同的“路线”,其语法与您的建议几乎相同 我将问题编辑得更具体。 【参考方案1】:

由于没有答案,我假设实际上没有答案。

我发现 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 
  )
  ...

【讨论】:

非常有用的答案!【参考方案2】:

遵循ws 包的原始教程https://www.npmjs.com/package/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);

【讨论】:

以上是关于url 路径中带有通配符的 Node.js 和 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

Fluentd 通配符 out_file 在文件路径中带有标记

路径部分中带有 // 的 URL 是不是有效?

解析没有路径但在查询中带有斜杠的 URL

Node.js——require加载规则

Node.js body-parser 不会解析 json 中带方括号的输入名称

如何从 php 或 node.js 获取 websocket url 路径