我有使用socket io的nodejs app。我将存储在./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
});
}
}
});
代码不起作用,只是调用了最后一个路由回调。 我的问题是:如何做到这一点?感谢
答案 0 :(得分:2)
您的代码为所有给定路由注册事件侦听器,但是当调用回调时,路由变量已经设置为last,因为for循环已经完成执行,因此您将认为它仅适用于最后一个值。基本上你需要的是捕获route
变量,使其对于每个给定的路由处理程序都是相同的。此问题及其解决方案在此处进行了详细介绍:JavaScript closure inside loops – simple practical example
执行以下操作之一:
使用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));
}
}