如何在 socket.io 中使用动态命名空间。
我正在寻找(可怜的)documentation ,并且它说必须像这样使用命名空间:
io.of('/news')
io.of('/akfda')
要使用命名空间,请执行 io.of("/namespace")
.
我需要在服务器中注册每个命名空间吗?也许我想要一个动态内容的命名空间。
我该怎么做:
io.of('/:somethign/:id')
最佳答案
Socket.IO 支持“房间”(https://github.com/LearnBoost/socket.io/wiki/Rooms),您可以使用它来代替命名空间。此外,当您需要动态路由时(并且您在应用中使用 express) - 最好的方法是使用 express box 中的路由引擎。
- Best way to do dynamic routing with Express.js (node.js)
- Using routes in Express-js
- http://expressjs.com/api.html#app.routes
- http://shtylman.com/post/expressjs-re-routing/
- http://jordanhoff.com/post/22602013678/dynamic-express-routing
但是,如果您仍然认为在 socket.io 的命名空间中需要动态,这里是如何实现它的小示例:
用户端:
var connect = function (ns) {
return io.connect(ns, {
query: 'ns='+ns,
resource: "socket.io"
});
}
var socket = connect('/user/12');
服务器端:
var url = require('url');
, ev = new events.EventEmitter()
// <ns name>: <ns regexp>
var routes = {
// /user/:id
'user': '^\\/user\\/(\\d+)$',
// /:something/:id
'default': '^\\/(\\\w+)\\/(\\d+)$'
};
// global entry point for new connections
io.sockets.on('connection', function (socket) {
// extract namespace from connected url query param 'ns'
var ns = url.parse(socket.handshake.url, true).query.ns;
console.log('connected ns: '+ns)
//
for (var k in routes) {
var routeName = k;
var routeRegexp = new RegExp(routes[k]);
// if connected ns matched with route regexp
if (ns.match(routeRegexp)) {
console.log('matched: '+routeName)
// create new namespace (or use previously created)
io.of(ns).on('connection', function (socket) {
// fire event when socket connecting
ev.emit('socket.connection route.'+routeName, socket);
// @todo: add more if needed
// on('message') -> ev.emit(...)
});
break;
}
}
// when nothing matched
// ...
});
// event when socket connected in 'user' namespace
ev.on('socket.connection route.user', function () {
console.log('route[user] connecting..');
});
// event when socket connected in 'default' namespace
ev.on('socket.connection route.default', function () {
console.log('route[default] connecting..');
});
希望对你有帮助!
关于javascript - 动态命名空间 Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143945/