【问题标题】:Node.js and Websocket with wildcard in url pathurl 路径中带有通配符的 Node.js 和 Websocket
【发布时间】: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 允许您使用通配符提供不同的“路线”,其语法与您的建议几乎相同
  • 我将问题编辑得更具体。

标签: javascript node.js websocket


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多