在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION['data'] = value

Posted

技术标签:

【中文标题】在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION[\'data\'] = value【英文标题】:Store session data using MemoryStore in Node, similar to $_SESSION['data'] = value in PHP在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION['data'] = value 【发布时间】:2011-11-17 05:11:08 【问题描述】:

问题:

是否可以在 php 中存储类似于 $_SESSION['somedata'] = "Hello" 的会话数据?

到目前为止,这是我的代码:

创建内存存储

var MemoryStore = express.session.MemoryStore,
    sessionStore = new MemoryStore();

快速配置

app.configure(function()
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session(
    store: sessionStore,
    secret: 'secret', 
    key: 'express.sid'));
  app.use(require('stylus').middleware(src: __dirname + '/public'));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
);

解析cookie以获取握手授权的会话ID

var parseCookie = require('connect').utils.parseCookie;

io.set('authorization', function (data, accept) 
  if (data.headers.cookie) 
    data.cookie = parseCookie(data.headers.cookie);
    data.sessionID = data.cookie['express.sid'];

    sessionStore.get(data.sessionID, function (err, session) 
      if (err) 
      
          accept(err.message, false); //Turn down the connection
       
      else
      
          data.session = session; //Accept the session
          accept(null, true);
      
    );
   else 
     return accept('No cookie transmitted.', false);
  
);

当密码和用户名都是“admin”时存储“loggedin”

io.sockets.on('connection', function (socket) 

  socket.on('details', function(data)
    console.log("Details: " + data.u + data.p);
    if(data.p == "admin" && data.u == "admin")
    
      //Add the logged in field to the session
    
  );
);

如果用户已登录,则将他们重定向到主页

app.get(navigation.login.uri, function(req, res)
  if(req.session.loggedin)
  
    res.redirect('/home');
  
  else
  
    res.render('login', 
      title: navigation.login.title,
      navigation: navigation
    );
  
);

当我尝试使用时:

req.session.loggedIn

值未定义。这可能是存储问题,还是我访问不正确?

【问题讨论】:

【参考方案1】:

你已经接近了 - 只是错过了几件事。

您在套接字授权函数中收集的信息可通过连接处理程序中的 socket.handshake 访问。

所以,我认为你想要的是:

io.sockets.on('connection', function (socket) 

  socket.on('details', function(data)
    console.log("Details: " + data.u + data.p);
    if(data.p == "admin" && data.u == "admin")
    
      //Add the logged in field to the session
      socket.handshake.session.loggedIn = true;  // Set the new session var
      socket.handshake.session.save();           // Save the modified session
    
  );
);

修改后不要忘记保存会话,否则它永远不会回到存储中。

【讨论】:

稍后我会试一试,谢谢!有没有你知道的关于这个主题的任何教程/更多信息的网站? 我收到以下错误:“Object # has no method 'save'”【参考方案2】:

这对我有用 - 你基本上只需要在 sessionStore 中设置一个键:

io.sockets.on('connection', function (socket) 
     socket.on('details', function(data)
          console.log("Details: " + data.u + data.p);
          if(data.p == "admin" && data.u == "admin")
          
               // set the value
               sessionStore.loggedIn = true;
               // get the value
               console.log(sessionStore.loggedIn);
          
     );
);

我在一个有一些子页面的网站上试了一下,值是一致的。强制重新加载或关闭浏览器会重置它。

【讨论】:

以上是关于在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION['data'] = value的主要内容,如果未能解决你的问题,请参考以下文章

express.session.MemoryStore 不返回会话?

内存存储 MemoryStore

内存存储 MemoryStore

为什么Rails的ActiveSupport :: Cache :: MemoryStore不适合大型应用程序?

node.js中express-session配置项详解

node.js中express-session配置项详解