Показать сообщение отдельно
  #1 (permalink)  
Старый 25.10.2017, 12:39
Новичок на форуме
Отправить личное сообщение для gofa Посмотреть профиль Найти все сообщения от gofa
 
Регистрация: 25.10.2017
Сообщений: 5

получение 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);
        });

    });
Ответить с цитированием