Я следовал этому руководству :http://www.danielbaulig.de/socket-ioexpress/, чтобы связать express.js с socket.io, и он работает блестяще.
У меня есть пользователь, входящий в систему на одной странице (Express.js POST-запрос, который устанавливает объект сеанса ), и когда они аутентифицируются, он направляет их на новую страницу, где загружается socket.io и на сокет сервера.io может получить сеанс, который был установлен из Express. Так что все работает нормально.
Теперь у меня есть пользователи на странице, которая использует 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);
}
});
Как мне проверить, есть ли у клиента, который должен быть принят, предыдущее соединение, и оно все еще открыто (и поэтому нам нужно отключить это старое соединение ).
В экспресс-сеансе есть «имя пользователя» -, поэтому мы можем получить объект сеанса и получить имя пользователя, я просто не могу понять, как просмотреть список всех клиентов socket.io и получить просмотрите экспресс-сеанс для каждого из них и проверьте, совпадает ли он с аутентификацией пользователя в данный момент.