получение username с mongodb при помощи сессии.
Разбираю куку. Получаю id сессии, сохраняю его в sid, который передается в loadSession, с помощью которого нахожу нужную сессию. Эта сессия передается в loadUser, который с помощью findById находит нужного юзера, которого сохраняю в handshake.user . Но в дальнейшем в io.sockets при обращении к handshake.user, выдает ошибку: "TypeError: Cannot read property 'get' of undefined". По какой то причине handshake.user не виден в io.sockets. Не могу понять почему. Помогите пжлста.
module.exports = function (server) {
var io = require('socket.io').listen(server);
io.set('origins', 'localhost:*');
// io.set('logger', log);
io.set('authorization', function (handshake, callback) {
async.waterfall([
function (callback) {
// сделать handshakeData.cookie - обьектом с cookie
handshake.cookies = cookie.parse(handshake.headers.cookie || '');
var sidCookie = handshake.cookies[config.get('session:key')];
var sid = cookieParser.signedCookie(sidCookie, config.get('session:secret'));
loadSession(sid, callback);
},
function (session, callback) {
if (!session) {
callback(new HttpError(401, 'No session'));
}
handshake.session = session;
loadUser(session, callback);
},
function (user, callback) {
if (!user) {
callback(new HttpError(403, 'Anonymous session may not connect'));
}
// сохраняю юзера
handshake.user = user;
callback(null);
}
], function (err) {
if (!err) {
return callback(null, true);
}
if (err instanceof HttpError) {
return callback(null, false);
}
callback(err);
});
});
function loadSession(sid, callback) {
sessionStore.get(sid, function (err, session) {
if(arguments.length == 0) {
// no arguments => no session
return callback(null, null);
} else {
return callback(null, session);
}
});
}
function loadUser(session, callback) {
if (!session.user) {
log.debug('Session %s is anonymous', session.id);
return callback(null, null);
}
log.debug('retrieving user ', session.user);
User.findById(session.user, function (err, user) {
if (err) return callback(err);
if (!user) {
return callback(null, null);
}
log.debug('user findbyid result: ' + user);
callback(null, user);
});
}
io.sockets.on('connection', function (socket) {
// обращение к сохраненному юзеру
var username = socket.handshake.user.get('username');
socket.broadcast.emit('join', username);
io.on('message', function (text, cb) {
socket.broadcast.emit('message', username, text);
cb && cb();
});
io.on('disconnect', function () {
socket.broadcast.emit('leave', username);
});
});
|
Чёта, судя по наличию библиотеки async, это код сильно устаревший (не, сама библиотека-то отличная... была). У них там что-то написано, что методы get и set устарели и поддерживаются только ради обратной совместимости. Вместо них следует использовать мидловер - io.use
|
да. я знаю. этот код старый. я пробовал его подстроить под нововведения но, он не выполнял даже то чна что способен этот(старый) код. по этому я и оставил его.
|
Я тут заглянул в объект сокета, и этот самый handshake находится, вообще-то, в
io.sockets.sockets а не в io.sockets Может, не там ищите? |
в io.sockets.on... при вызове console.log(socket.handshake); выводит информацию о handshake, значит путь правильный. Но среди этой информации нету user'a которого я якобы чуть раньше сохранил в handshake.user. вот в чем загвоздка.
|
Не знаю. Я сейчас на connection тупо вписал в объект сокета строчку
socket.handshake.sess = "asadsfsgfsgshdhdhdjdj"; и она туда вписалась, и там всё время гуляния по комнатам исправно оставалась. Раз вписал - куда она может деться? Вообще, я много чего "экспериментировал" с сокетами, но так не делал - сдаюсь. Я задачу в целом, видимо, не понимаю. |
В connection и у меня сохраняет и значение остается. А я то сохраняю в authorization. И проверял, обьект был, и есть в 'handshake.user' но с connection его не видно по какой то причине.
|
Да я, честно говоря, не понял даже, откуда взялся id юзера, по которому он ищется в базе - id соединения всегда ведь случайный.
Ну ладно. Я ж говорю - я в целом не понимаю, что тут происходит и зачем. |
| Часовой пояс GMT +3, время: 20:07. |