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

标签 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="'+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');
       }

    });

});

现在我想将存储到 session 对象的“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);
    }
});

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

最佳答案

我不确定您是否仍在处理此问题,但您可以仅使用 MemoryStore 访问 session 数据。毕竟,如果它不起作用,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 中提取 session 。另外,请记住重新启动 Express 服务器会破坏您的所有 session ,因此每次重新启动后您都需要一个新的 cookie。

关于node.js - 如何通过 socket.io 对象访问 express.session.MemoryStore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889552/

相关文章:

node.js - MVC 模式与带有公共(public)布局和部分的 Node.js

c - 最小化客户端处理 - C 套接字编程

java - 套接字超时异常 : Read timed out httpclient

session - Gorilla Web Toolkit session Memcache 实现

使用sql server模式的asp.net session

javascript - 使用 typescript 在 Node 项目中导入 Node 获取

mysql - mysql SP 中使用数组参数时出错

angularjs - 基于标志在 Sequelize 中添加 "where"查询

c - 从 HTTP 套接字读取段错误

c# - 获取添加 onrowdatabound asp.net c# 的下拉列表的值