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

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

代码没有工作,只是最后一个路由callback是呼叫。 我的问题是:如何做到这一点? 谢谢

你的代码注册了所有给定路由的事件监听器,但是当调用callback函数时,由于for循环已经执行完毕,所以routevariables已经被设置为last,所以你会认为它只适用于最后一个值。 基本上你需要的是捕获routevariables,对每个给定的路由处理器来说都是一样的。 这个问题和解决scheme在这里更多地描述: JavaScript闭合内部循环 – 一个简单的实例

执行以下任一操作:

使用Object.keys和forEach循环。 这可能是这里最干净的解决scheme:

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

或者将路由绑定到这个variables:

 for (var route in router.routes) { if (router.routes.hasOwnProperty(route)) { socket.on(route, function(data) { var route = this; }.bind(route)); } }