2014-05-15 2 views
2

socket io를 사용하는 nodejs 앱이 있습니다. 모든 이벤트 리스너 나는config에서 socket io event listener를로드하는 방법은 무엇입니까?

module.exports.routes = { 
    '/auth/login': { 
    controller: 'auth', 
    action: 'login' 
    }, 
    '/user/register': { 
    controller: 'user', 
    action: 'register' 
    }, 
    '/auth/logout': { 
    controller: 'auth', 
    action: 'logout' 
    } 
}; 

주요 애플 리케이션과 같은 ./config/routes.js에 저장하는 것입니다 :

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

, 콜백이 그 안에 정의 만 LAST 콜백을 말하는가 호출 될 때, 당신은이 문제가있는 나는 추측한다 : http://stackoverflow.com/q/750486/774086 나는 이것을 중복으로 표시하고있다. –

답변

2

귀하의 코드는 모든 주어진 경로에 대해 이벤트 리스너를 등록하지만 for 루프가 이미 실행을 마쳤 기 때문에 콜백이 호출되면 route 변수가 이미 설정되어 있으므로 마지막으로 만 작동한다고 생각할 것입니다. 값. 기본적으로 필요한 것은 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` 루프를 볼 수 있기 때문에

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

그것은 매력처럼 작동합니다! 첫 번째 해결책은 훌륭합니다! 많은 감사합니다! – anhnt

관련 문제