【问题标题】:How do I access cookie-session middleware in socket.io on NodeJS?如何在 NodeJS 上的 socket.io 中访问 c​​ookie-session 中间件?
【发布时间】:2015-01-26 06:44:54
【问题描述】:

我决定在我的应用程序中使用 socket.io 并偶然发现了一个问题。我使用cookie-session 进行快速授权:

var session = require('cookie-session');
var app = express();
// ...
app.use(session({
  keys: ['secretkey1', 'secretkey2']
}))
// ...
app.get('/settings', function(req, res) {
    res.type("html");

    if (!req.session.sid)    {
        console.log("NO SID");
        req.session.sid = util.randomString();
    }
    else {
        console.log("sid:" + req.session.sid);
    }

    // doing stuff with req.session.sid

    var jadeView = { /*...*/ };
    res.status(200).send(mainJade(jadeView));
});

现在我使用 socket.io。我想出了如何访问 cookie:

io.sockets.on('connection', function(socket) {
    var cookie_string = socket.request.headers.cookie;
    console.log("cookies: " + cookie_string);
// ...
}

但是如何将cookie_string 转换为会话对象,例如req.session

【问题讨论】:

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


    【解决方案1】:

    发生了什么变化

    @rmflow 2014 年的回答在 2017 年似乎不适用于 socket.io-client 2.0.2 和 cookie-session 2.0.0

    显然,cookies 包(cookie-session 的主要依赖项)需要一些不同的请求和响应对象。也就是说,请求对象应该有一个connection 对象和一个布尔值encrypted 属性;另外,响应对象应该有getHeadersetHeader方法。

    更新的解决方案

    const session = require('cookie-session')({
        name: 'some-session-name',
        secret: 'some-session-secret', // or an array of keys as usual
        ... // Other relevant options
    });
    
    io.on('connection', socket => {
        let cookieString = socket.request.headers.cookie;
    
        let req = {connection: {encrypted: false}, headers: {cookie: cookieString}}
        let res = {getHeader: () =>{}, setHeader: () => {}};
        //
        session(req, res, () => {
            console.log(req.session); // Do something with req.session
        })
    })
    

    【讨论】:

      【解决方案2】:

      自己想通​​了:

      var req = { headers : {cookie : cookie_string} }
      session({ keys: ['secretkey1', 'secretkey2'] })(req, {}, function(){})
      console.log(req.session.sid);
      

      【讨论】:

        猜你喜欢
        • 2014-09-27
        • 1970-01-01
        • 2012-06-13
        • 2010-09-11
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        相关资源
        最近更新 更多