Node.js 如何通过socket.io对象访问express.session.MemoryStore?

Node.js 如何通过socket.io对象访问express.session.MemoryStore?,node.js,sockets,session,express,Node.js,Sockets,Session,Express,我在登录函数中执行此操作 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="'+passw

我在登录函数中执行此操作

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”发送到会话对象。我该怎么做?我读过书,但由于缺乏经验,我在使用上面临困难。我在代码中使用了它

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


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

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


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

我不确定您是否仍在处理此问题,但您可以仅使用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 server会破坏您的所有会话,因此每次重新启动后您都需要一个新的cookie。

是否需要使用DB存储会话,我已经创建了一个MemoryStore var MemoryStore=Express.session.MemoryStore;var sessionStore=newmemorystore();它不应该保存会话数据吗?@newbie
MemoryStore
不是为生产环境设计的。建议使用内存中的数据库存储(如redis store)来实现这一点。请参阅Invoking express.session.MemoryStore()已被弃用并抛出:“错误:大多数中间件(如会话)不再与express捆绑,必须单独安装。请参阅。”@giladmayani在3年前写这篇文章时,会话仍然捆绑在express中。如果您使用的是较新的版本,请尝试
require('express-session')。MemoryStore()
只是为了强调一点-因为我被它抓住了-记住在从
MemoryStore()
类创建变量时使用
new
。不这样做不会生成错误,但意味着当您设置store选项时,会话将忽略该错误,并且您的变量将为空<代码>常量表达式=要求('express');const session=require('express-session');const sessionMemoryStore=新建会话.MemoryStore();var-app=express();使用(会话({secret:'abc',store:sessionMemoryStore,resave:false,saveUninitialized:false,cookie:{maxAge:30000}))
{
  "err": null,
  "data": {
    "cookie": {
      "originalMaxAge": null,
      "expires": null,
      "httpOnly": true,
      "path": "/"
    }
  }
}