如何从配置中加载套接字io事件监听器

How to load socket io event listener from config?

本文关键字:套接字 io 事件 监听器 加载 配置      更新时间:2023-09-26

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