node.js - 如何在 NodeJS 上访问 socket.io 中的 cookie-session 中间件?

标签 node.js session cookies express socket.io

我决定在我的应用程序中使用 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 转换为 session 对象,如 req.session 中那样?

最佳答案

发生了什么变化

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

显然,cookies包(cookie-session 的主要依赖项)期望请求和响应对象有所不同。也就是说,请求对象应该有一个带有 bool 加密属性的connection对象;此外,响应对象应具有 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
    })
})

关于node.js - 如何在 NodeJS 上访问 socket.io 中的 cookie-session 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174566/

相关文章:

node.js - 使用 HTML5 视频标签从 Node.js 服务器上的 MinIO 存储桶流式传输视频

c# - 在 C# 中创建 session

php - 如何通过结束 session 从站点注销

javascript - cookie 未按预期设置

javascript - 创建一个只能从 JS 访问的 cookie,并且不会随每个请求一起发送/

node.js - Node.js 和 NPM 的 Coding Assistance 在 WebStorm 中无法启用

javascript - node.js 可以取代 Ruby 吗?

cookies - 在 Selenium 中,如何使用现有的 cookie 打开 Firefox 浏览器

javascript - Bluebird 返回 promise 丢失警告

PHP+MYSQL 需要在同一个 Windows 服务器上与 ASPX+MSSQL 一起使用