Как загрузить сокет io event listener из config?

У меня есть приложение 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 внутри циклов – простой практический пример

Выполните одно из следующих действий:

Используйте 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)); } }