如何从配置中加载套接字io事件监听器
How to load socket io event listener from config?
我有nodejs应用程序使用socket io。所有的事件监听器我将存储在。/config/routes.js
module.exports.routes = {
'/auth/login': {
controller: 'auth',
action: 'login'
},
'/user/register': {
controller: 'user',
action: 'register'
},
'/auth/logout': {
controller: 'auth',
action: 'logout'
}
};
主应用如下:
var router = require('./config/routes.js');
var io = require('socket.io').listen(8888);
// Socket events
io.sockets.on('connection', function(socket) {
for (var route in router.routes) {
if (router.routes.hasOwnProperty(route)) {
socket.on(route, function(data) {
// Do callback
});
}
}
});
代码不工作,只调用了最后一个路由回调。我的问题是:如何做到这一点?由于
你的代码为所有给定的路由注册事件侦听器,但是当回调被调用时,路由变量已经设置为持续,因为for循环已经完成执行,所以你会认为它只适用于最后一个值。基本上,您需要的是捕获route
变量,以一种对于每个给定的路由处理程序都相同的方式。这个问题和它的解决方案在这里有更多的描述:JavaScript闭包内循环-简单的实际例子
执行下列操作之一:
使用对象。键和forEach循环。这可能是这里最干净的解决方案:
Object.keys(router.routes).forEach(function (route) {
socket.on(route, function(data) {
});
})
或将代码包装在一个立即调用的函数中。
for (var route in router.routes) {
if (router.routes.hasOwnProperty(route)) {
(function (route) {
socket.on(route, function(data) {
});
})(route);
}
}
或者将route绑定到这个变量:
for (var route in router.routes) {
if (router.routes.hasOwnProperty(route)) {
socket.on(route, function(data) {
var route = this;
}.bind(route));
}
}
相关文章:
- 快速的套接字 io 实例/中间件
- 套接字io客户端网络::ERR_CONNECTION_REFUSED
- 套接字 IO 的选择传输方法
- 无法加载套接字.io.js
- 套接字IO示例
- 套接字IO未连接到正确的服务器
- 服务器到服务器套接字IO消息
- 套接字 IO 未使用 swift 连接到服务器
- 显示多个用户使用套接字 IO 加入
- 节点/套接字 IO 多个播放器
- 我无法将套接字io与Windows Phone 8.1 C#连接
- 套接字 IO 1.2 查询参数
- 发出到套接字 IO socket.id
- 使用 angularJs 显示来自套接字 io 的数据
- 使用套接字io和angularjs处理频繁变化的时间序列数据的策略
- NodeJS 套接字 IO 停止随机发射
- 节点快速 3x 套接字 IO 测试
- 套接字 IO 重新连接
- 使用 jwt 和套接字 io 的身份验证流
- 找不到套接字IO(404)