我有使用套接字io 的nodejs 应用程序。我将存储在 ./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 闭包 – 简单的实际示例 https://stackoverflow.com/q/750486/774086
执行以下操作之一:
使用 Object.keys 和 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);
}
}
或者将路由绑定到该变量:
for (var route in router.routes) {
if (router.routes.hasOwnProperty(route)) {
socket.on(route, function(data) {
var route = this;
}.bind(route));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)