Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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);
        });

    });
Ответить с цитированием
  #2 (permalink)  
Старый 25.10.2017, 15:20
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Чёта, судя по наличию библиотеки async, это код сильно устаревший (не, сама библиотека-то отличная... была). У них там что-то написано, что методы get и set устарели и поддерживаются только ради обратной совместимости. Вместо них следует использовать мидловер - io.use
Ответить с цитированием
  #3 (permalink)  
Старый 25.10.2017, 15:34
Новичок на форуме
Отправить личное сообщение для gofa Посмотреть профиль Найти все сообщения от gofa
 
Регистрация: 25.10.2017
Сообщений: 5

да. я знаю. этот код старый. я пробовал его подстроить под нововведения но, он не выполнял даже то чна что способен этот(старый) код. по этому я и оставил его.
Ответить с цитированием
  #4 (permalink)  
Старый 25.10.2017, 17:35
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Я тут заглянул в объект сокета, и этот самый handshake находится, вообще-то, в
io.sockets.sockets

а не в io.sockets
Может, не там ищите?
Ответить с цитированием
  #5 (permalink)  
Старый 25.10.2017, 17:54
Новичок на форуме
Отправить личное сообщение для gofa Посмотреть профиль Найти все сообщения от gofa
 
Регистрация: 25.10.2017
Сообщений: 5

в io.sockets.on... при вызове console.log(socket.handshake); выводит информацию о handshake, значит путь правильный. Но среди этой информации нету user'a которого я якобы чуть раньше сохранил в handshake.user. вот в чем загвоздка.
Ответить с цитированием
  #6 (permalink)  
Старый 25.10.2017, 18:20
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Не знаю. Я сейчас на connection тупо вписал в объект сокета строчку
socket.handshake.sess = "asadsfsgfsgshdhdhdjdj";
и она туда вписалась, и там всё время гуляния по комнатам исправно оставалась. Раз вписал - куда она может деться?
Вообще, я много чего "экспериментировал" с сокетами, но так не делал - сдаюсь.
Я задачу в целом, видимо, не понимаю.

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

В connection и у меня сохраняет и значение остается. А я то сохраняю в authorization. И проверял, обьект был, и есть в 'handshake.user' но с connection его не видно по какой то причине.
Ответить с цитированием
  #8 (permalink)  
Старый 25.10.2017, 19:22
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Да я, честно говоря, не понял даже, откуда взялся id юзера, по которому он ищется в базе - id соединения всегда ведь случайный.
Ну ладно. Я ж говорю - я в целом не понимаю, что тут происходит и зачем.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить некоторые ссылки со страницы при помощи js goga5 Общие вопросы Javascript 7 12.07.2016 14:41
Масштабирование при помощи javascript mooni Элементы интерфейса 2 17.06.2013 17:51
Обратная связь ПРИ ПОМОЩИ JavaScript qwertypop Элементы интерфейса 2 23.04.2009 18:30
изменение рисунка в меню при помощи Javasripta Maxim Общие вопросы Javascript 1 05.09.2008 14:59
Подскажите как при помощи JS hta в трею свернуть kimboo Общие вопросы Javascript 4 11.07.2008 16:00