Подтвердить что ты не робот

Как получить доступ к сеансу в экспресс, за пределами req?

Я знаю, что могу использовать

function(req, res) {
    req.session
}

используя экспресс. Однако мне нужно получить доступ к сеансу вне функции ответа. Как мне это сделать?

Я использую socket.io для передачи информации для добавления сообщений и комментариев. Поэтому, когда я получаю сообщение socket.io на стороне сервера, мне нужно проверить, кто отправляет информацию, используя сеанс. Однако, поскольку это выполняется через socket.io, нет req/res.

4b9b3361

Ответ 1

Используя socket.io, я сделал это простым способом. Я предполагаю, что у вас есть объект для вашего приложения, скажем, MrBojangle, для меня это называется Shished:

/**
 * Shished singleton. 
 *
 * @api public
 */
function Shished() {
};


Shished.prototype.getHandshakeValue = function( socket, key, handshake ) {                          
    if( !handshake ) {
        handshake = socket.manager.handshaken[ socket.id ];                                         
    }
    return handshake.shished[ key ];                                                                
};                                                                                                  

Shished.prototype.setHandshakeValue = function( socket, key, value, handshake ) {                   
    if( !handshake ) {
        handshake = socket.manager.handshaken[ socket.id ];                                         
    }
    if( !handshake.shished ) {
        handshake.shished = {};                                                                     
    }
    handshake.shished[ key ] = value;                                                               
};

Затем по вашему методу авторизации я использую MongoDB для хранения сеанса:

io.set('authorization', function(handshake, callback) {
    self.setHandshakeValue( null, 'userId', null, handshake );
    if (handshake.headers.cookie) {
        var cookie = connect.utils.parseCookie(handshake.headers.cookie);
        self.mongoStore()
        .getStore()
        .get(cookie['connect.sid'], function(err, session) {
            if(!err && session && session.auth && session.auth.loggedIn ) {
                self.setHandshakeValue( null,
                            'userId',
                            session.auth.userId,
                            handshake );
            }
        });
    }

Затем перед сохранением записи в модели вы можете сделать:

model._author = shished.getHandshakeValue( socket, 'userId' );

Ответ 2

Думаю, у меня другой ответ.

код:

var MongoStore = require('connect-mongo')(session);
var mongoStore = new MongoStore({
    db:settings.db,            //these options values may different
    port:settings.port,
    host:settings.host
})
app.use(session({
    store : mongoStore
    //here may be more options,but store must be mongoStore above defined
}));

тогда вы должны определить ключ сеанса в req, как:

код:

req.session.userEmail;

наконец, вы можете получить его так:

код:

var cookie = require("cookie"); //it may be defined at the top of the file
io.on("connection",function(connection){

 var tS = cookie.parse(connection.handshake.headers.cookie)['connect.sid'];
 var sessionID = tS.split(".")[0].split(":")[1];
 mongoStore.get(sessionID,function(err,session){
      console.log(session.userEmail);
 });
}

У меня вчера был тест, он работал хорошо.

Ответ 3

Предполагая, что ваш код socket.io выглядит примерно так:

io.on('connection',
function(client) {
  console.log(client.request)
});

Запрос client.request, как показано в примере выше.

Изменить: Как отдельная вещь, может быть, это поможет: https://github.com/aviddiviner/Socket.IO-sessions

Ответ 4

Я считаю, что проверка socket.handshake должна дать вам сеанс:

io.sockets.on('connection', function(socket) { 
  console.log(socket.handshake.sessionID);
});

Когда клиент устанавливает соединение сокета с вашим сервером socket.io, клиент отправляет запрос на подтверждение WebSocket. То, что я делаю выше, это захват идентификатора сеанса из рукопожатия.