如何从config加载socket io事件监听器?

时间:2014-05-15 06:20:50

标签: javascript node.js socket.io

我有使用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
      });
    }
  }
});

代码不起作用,只是调用了最后一个路由回调。 我的问题是:如何做到这一点?感谢

1 个答案:

答案 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));
  }
}