How to access session in express, outside of the req?

后端 未结 4 1331
梦如初夏
梦如初夏 2021-02-04 01:14

I know that I can use

function(req, res) {
    req.session
}

using express. However I need to access the session outside of the response func

相关标签:
4条回答
  • 2021-02-04 01:56

    Using socket.io, I've done this in a simple way. I assume you have an object for your application let's say MrBojangle, for mine it's called 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;                                                               
    };
    

    Then on your authorization method, I'm using MongoDB for session storage:

    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 );
                }
            });
        }
    

    Then before saving a record in the model, you can do:

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

    0 讨论(0)
  • 2021-02-04 01:59

    I think I have a different answer.

    code:

    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
    }));
    

    then you should define a session key at req,just like :

    code:

    req.session.userEmail;
    

    finally,you can get it this way:

    code:

    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);
     });
    }
    

    I had test it yesterday, it worked well.

    0 讨论(0)
  • 2021-02-04 02:01

    I believe checking socket.handshake should get you the session:

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

    When the client establishes a socket connection with your socket.io server, the client sends a WebSocket handshake request. What I'm doing above is grabbing the session ID from the handshake.

    0 讨论(0)
  • 2021-02-04 02:08

    Assuming your socket.io code looks kinda like this:

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

    The request is client.request as shown in the example above.

    Edit: As a separate thing, maybe this would help: https://github.com/aviddiviner/Socket.IO-sessions

    0 讨论(0)
提交回复
热议问题