【问题标题】:How can I access a express session in socket.io events?如何访问 socket.io 事件中的快速会话?
【发布时间】:2014-04-30 19:51:24
【问题描述】:

我目前正在使用 express 和 socket.io 并构建了一个仅接受来自已登录用户的 socket.io 连接的应用程序。我举了一个简单的例子。请参阅 io.sockets.on('connection') 部分:

var express = require('express');

var app = express();
var http = require('http').createServer(app);

var io = require('socket.io').listen(http);

var sessionStore = new express.session.MemoryStore();

io.set('authorization', function (handshake, accept)
{
    // I got this from a gist.
    // Don't know the link anymore, though.
    var cookies = require('express/node_modules/cookie').parse(handshake.headers.cookie);
    var parsed = require('express/node_modules/connect/lib/utils').parseSignedCookies(cookies, 'SESSION_SECRET');

    sessionStore.get(parsed.sid, function (error, session)
    {
        if (error != null)
        {
            accept(error, false);
            return;
        }

        if (session != null && session.user != null)
        {
            accept(null, true);
        }
        else
        {
            accept('Not a logged in user.', false);
        }
    });
});

io.sockets.on('connection', function (socket)
{
    // client with an user object in his session (= logged in)
    // connected. But how can I access this session in here?
});

app.use(express.cookieParser('COOKIE_SECRET'));

app.use(express.session({
    secret: 'SESSION_SECRET',
    key: 'sid',
    store: sessionStore
}));

app.use(express.urlencoded());
app.use(express.json());

app.get('/', function (request, response)
{
    response.sendfile('static/index.html');
});

app.post('/', function (request, response)
{
    request.session.user = null;

    var post = request.body;

    if (post.username === 'admin' && post.password === 'admin')
    {
        request.session.user = post;
    }

    response.redirect('/');
});

http.listen(80);

到目前为止一切正常。只有在会话中有用户(= 他们已登录)的用户才能通过 socket.io 连接。但是,我目前被困在客户实际这样做的时候,因为我无法在那个时候获得会话。

有什么想法吗?

【问题讨论】:

    标签: node.js session express websocket socket.io


    【解决方案1】:

    您可以使用passport.socketio

    【讨论】:

      【解决方案2】:

      如果我理解了这个问题,那么您希望稍后与您的socket 对象进行快速会话。你可以这样做:

      if (session != null && session.user != null){
         accept(null, true);
         handshake.session = session;
      }
      

      您可以通过以下方式访问它:

      socket.handshake.session
      

      希望这会奏效

      【讨论】:

        猜你喜欢
        • 2012-09-27
        • 2021-10-12
        • 2023-04-03
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多