【问题标题】:How to access express.session.MemoryStore via socket.io objects?如何通过 socket.io 对象访问 express.session.MemoryStore?
【发布时间】:2013-11-22 06:18:43
【问题描述】:

我在登录功能中这样做

app.post('/teacherlogin', function(request, response) {
    var username = request.body.username;
    var password = request.body.password;
    con.query('SELECT t_id from login_teacher where username="'+username+'" and password="'+password+'"',function(err,results){

       if(results.length > 0) {

           request.session.regenerate(function(){
              request.session.user = username;
              request.session.type = 'teacher';
              request.session.id = results[0].t_id;
              response.redirect('/teacherhome');
          });

       } else {

          response.redirect('teacherlogin');
       }

    });

});

现在我想将存储到会话对象的“id”和“type”发出。我该怎么做?我已经阅读了this article,但由于缺乏经验,我在使用它时遇到了困难。我已经在我的代码中使用了它

var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
app.use(express.bodyParser());
app.use(express.cookieParser('secret text'));
app.use(express.session({
    store: sessionStore,
    secret: 'secret', 
    key: 'express.sid'}
));

var Session = require('connect').middleware.session.Session;
io.set('authorization', function (data, accept) {
    if (data.headers.cookie) {
        data.cookie = require('cookie').parse(data.headers.cookie);
        data.sessionID = data.cookie['express.sid'].split('.')[0];
        console.log('data.sessionID "'+data.sessionID);
        data.sessionStore = sessionStore;
        sessionStore.get(data.sessionID, function (err, session) {
           if (err || !session) {
               accept('Error', false);
           } else {
               data.session = new Session(data, session);
               accept(null, true);
           }
        });
    } else {
      return accept('No cookie transmitted.', false);
    }
});

我在会话对象中没有得到任何东西。我试图记录 sessionStore 的内容,它似乎是空的!这是否意味着我存储在会话中的信息没有存储在 sessionStore 中?如果是,我应该怎么做才能将其存储在那里?如果它存储在那里,为什么 sessionStore.get 函数找不到它?

【问题讨论】:

    标签: node.js sockets session express


    【解决方案1】:

    我不确定您是否仍在处理此问题,但您可以仅使用 MemoryStore 访问会话数据。毕竟,如果它不起作用,Express 还能如何使用它? :)

    演示 MemoryStore 工作的简单方法如下:

    var express = require("express")
      , app = express()
      , sessionStore = new express.session.MemoryStore();
    
    // middleware
    app.use(express.cookieParser());
    app.use(express.session({store: sessionStore, secret: "mysecret"}));
    
    // any endpoint sets a cookie
    app.get("/", function(req,res) {
      res.send('ok');
    });
    
    // This endpoint reveals it
    app.get("/session", function(req, res){
      sessionStore.get(req.sessionID, function(err, data) {
        res.send({err: err, data:data});
      });
    });
    
    app.listen(3000);
    

    点击/ 后跟/session 会得到以下响应:

    {
      "err": null,
      "data": {
        "cookie": {
          "originalMaxAge": null,
          "expires": null,
          "httpOnly": true,
          "path": "/"
        }
      }
    }
    

    我怀疑您的问题可能是您如何从套接字获取 sessionID,但绝对可以从 MemoryStore 中提取会话。另外,请记住重新启动 Express 服务器会破坏您的所有会话,因此每次重新启动后您都需要一个新的 cookie。

    【讨论】:

    • 不推荐调用 express.session.MemoryStore() 并抛出:“错误:大多数中间件(如会话)不再与 Express 捆绑,必须单独安装。请参阅 github.com/senchalabs/connect#middleware。”
    • @giladmayani 当我 3 年前写这篇文章时,会话仍然捆绑在 express 中。如果您使用的是更新版本,请尝试require('express-session').MemoryStore();
    • 只是为了强调——因为它让我感到困惑——记得在从 MemoryStore() 类创建变量时使用 new。不这样做不会产生错误,但意味着当您设置存储选项时 Session 会忽略它,并且您的变量将为空。 const express = require('express'); const session = require('express-session'); const sessionMemoryStore=new session.MemoryStore(); var app = express(); app.use(session({ secret: 'abc', store: sessionMemoryStore, resave: false, saveUninitialized: false, cookie:{maxAge:30000} }) );
    【解决方案2】:

    您必须使用数据库来存储您的 express session,然后解析 socket.io 定义中的 cookie 数据,并使用获得的信息从数据库中获取 session 信息,这是一个完整的示例:

    https://stackoverflow.com/a/13098742/218418

    您还可以使用从 cookie 中解析的会话 ID,并将用户加入带有会话名称的“聊天室”。

    【讨论】:

    • 是否需要使用DB来存储session,我创建了一个MemoryStore var MemoryStore = express.session.MemoryStore; var sessionStore = new MemoryStore();它不应该保存会话数据吗?
    • @newbie MemoryStore 不是为生产环境设计的。建议使用像 redis-store 这样的内存数据库存储来实现这一点。见github.com/expressjs/session#sessionoptions
    猜你喜欢
    • 2011-01-19
    • 2015-04-11
    • 2017-05-28
    • 1970-01-01
    • 2022-01-11
    • 2014-04-18
    • 2015-08-17
    • 2012-02-28
    • 2019-01-26
    相关资源
    最近更新 更多