이 가이드를 따라 : express.js를 socket.io에 연결하기 위해 http://www.danielbaulig.de/socket-ioexpress/을 수행했으며 훌륭하게 작동합니다.동일한 사용자로부터 여러 socket.io 연결을 감지하는 방법
사용자가 한 페이지 (세션 객체를 설정하는 express.js POST 요청)에 로그인하고 인증 한 경우 socket.io가로드되고 서버 socket.io가로드 할 수있는 새 페이지로 사용자를 안내합니다. 익스프레스에서 설정 한 세션을 잡아. 그래서 모든 것이 잘 작동합니다.
이제 socket.io를 사용하는 페이지를 새로 고칠 때 사용자가 페이지를 새로 고칠 때가 있습니다. socket.io 연결이 여전히 존재하는 경우가 있습니다 (즉, 연결이 끊어지지 않음). 내가 뭘 하려는지 io.set('authorization')
함수를 변경하여 사용자가 연결할 때 해당 클라이언트에 아직 열려있는 모든 기존 socket.io 인스턴스의 연결을 끊습니다. 여기
//socket.io connect to express
var parseCookie = require('connect').utils.parseCookie;
io.set('authorization', function (data, accept) {
if (data.headers.cookie)
{
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
// (literally) get the session data from the session store
sessionStore.get(data.sessionID, function (err, session)
{
if (err || !session)
{
// if we cannot grab a session, turn down the connection
//note: a session is created when the user logs in
accept('Error', false);
}
else
{
//TODO something here before we accept the connection
//??
// save the session data
data.session = session;
//accept the connection
accept(null, true);
}
});
}
else
{
return accept('No cookie transmitted.', false);
}
});
, 그것은 여전히 열려 있습니다 (따라서 우리는 필요 그 오래된 것을 분리하십시오).
익스프레스 세션에 "username"이 있습니다. 세션 개체를 가져 와서 사용자 이름을 얻을 수 있기 때문에 모든 socket.io 클라이언트 목록을 확인하는 방법을 알지 못합니다. 각각에 대한 특급 세션을보고 현재 인증하는 사용자와 동일한 지 확인하십시오.
네, 가장 쉬운 옵션입니다. 글로벌 socket.io 변수를 사용하는 방법이 있어야합니다. – Andrew
TornadIO2를 사용합니다.이 경우에는 그런 일을 위해 내장 된 방법이 없습니다 (소스 코드를 한 라인 씩 찾음). 하지만 Node.js를 socket.io와 함께 서버에서 사용한다면 확실하지 않습니다. –
네,이 일이 가장 쉬운 방법 인 것처럼 보입니다. 배열에 모든 연결을 저장하고 있으므로 액세스 할 수 있습니다 ... 건배. – Andrew