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 在文件路径中带有标记