Node.js 因为connect不支持';如果不再使用parseCookie方法,我们如何使用express获取会话数据?

Node.js 因为connect不支持';如果不再使用parseCookie方法,我们如何使用express获取会话数据?,node.js,session,authentication,express,socket.io,Node.js,Session,Authentication,Express,Socket.io,在node.js和express中,有许多示例演示了如何获取会话数据 正如您在访问第3个链接时所看到的,它是指向StackOverflow的链接。这是一个很好的答案,但正如@UpTheCreek在这些评论中指出的,connect不再具有parseCookie方法。我也遇到了这个问题。我找到的所有教程都使用了connect的parseCookie方法,而该方法现在并不存在。所以我问他我们怎样才能得到会话数据,他说他不知道最好的方法,所以我想我会把问题贴在这里。使用express@3.0.

在node.js和express中,有许多示例演示了如何获取会话数据

正如您在访问第3个链接时所看到的,它是指向StackOverflow的链接。这是一个很好的答案,但正如@UpTheCreek在这些评论中指出的,connect不再具有parseCookie方法。我也遇到了这个问题。我找到的所有教程都使用了connect的
parseCookie
方法,而该方法现在并不存在。所以我问他我们怎样才能得到会话数据,他说他不知道最好的方法,所以我想我会把问题贴在这里。使用
express@3.0.0rc4
socket.io
redis
,我们如何获取会话数据并使用这些数据授权用户?我已经能够使用
require('connect').utils.parseSignedCookie,但当我这么做时,握手时总会收到警告/错误

warn - handshake error Error
从我读到的情况来看,这听起来并不是一个永久的解决办法。
更新

好的,我在服务器上运行了
session.socket.io
。正如我所怀疑的,我在授权的时候被卡住了。我想我可能走错了方向,所以请随时纠正我。在我的Redis数据库中,我将拥有用户信息。他们第一次登录时,我想更新他们的cookie,使其包含用户信息。下一次他们回到网站时,我想检查他们是否有cookie,以及用户信息是否在那里。如果没有,我想把它们发送到登录屏幕。在登录屏幕上,当用户提交信息时,它将根据Redis数据库测试该信息,如果匹配,它将使用用户信息更新cookie。我的问题是:

1)如何通过Redistore更新/更改cookie?

2)会话数据似乎只保存在cookie中。如果有人关闭了Cookie,我如何在页面之间跟踪用户信息?

以下是我的适用代码:

//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');

app.configure(function(){
  //...hiding unapplicable code...
  app.use(cookieParser);
  app.use(express.session({secret: 'secret', store: redis_store}));
});

//...hiding code that starts the server and socket.io

var SessionSockets = require('session.socket.io');
var ssockets = new SessionSockets(io, redis_store, cookieParser);

io.configure(function(){
  io.set('authorization', function(handshake, callback){
    if(handshake.headers.cookie){
      //var cookie = parseCookie(handshake.headers.cookie);
      //if(cookie.user){
      //  handshake.user = cookie.user;
      //}
    }
    callback(null, true);
  });
});

ssockets.on('connection', function(err, socket, session){ ... });

会话数据可通过以下方式获得:

req.session

看一下插座。io的。尤其是零件和零件

它展示了如何将socket.io与
redistore
一起使用,并给出了两种不同的授权方法

有关连接express v3、redis和socket.io的更多信息

您的问题:

  • 如何通过Redistore更新/更改cookie
  • 看起来会话数据只保存在cookie中。如果有人关闭了Cookie,我如何在页面之间跟踪用户信息
  • Cookie/会话/重新存储想法:

  • 通常,您只有一个cookie,即会话id
  • 所有用户状态都存储在服务器上的“会话”中,可以通过会话id找到该会话
  • 您可以使用Redis作为会话数据的后端存储
  • Redis将允许您保持会话状态,即使在服务器重新启动时也是如此(好事情)
  • 您可以在会话中存储大量数据(req.session.key=value)
  • 在用户注销或会话过期之前,会话中存储的所有数据都将保持不变
  • 示例node.js代码:

    var app = express.createServer(
      express.static(__dirname + '/public', { maxAge: 31557600000 }),
      express.cookieParser(),
        express.session({ secret: 'secret', store: new RedisStore({
              host: 'myredishost',
              port: 'port',
              pass: 'myredispass',
              db: 'dbname',
          }, cookie: { maxAge: 600000 })})
    );
    
    会议和想法:

  • 你的第二期向我们介绍了没有cookie的会话。这是可能的
  • 基本上,您将会话id放在发送到服务器的每个请求的url上
  • 我坚信大多数人都允许吃饼干
  • 如果这是一项要求,谷歌:

  • 切换到
    session.socket.io
    一段时间后,由于加载会话信息时模块的异步性质,我遇到了一些问题。所以我最终创建了自己的模块,名为。它是这样使用的:

    var express = require('express');
    var app = express();
    var server = require('http').createServer(app);
    
    //Setup cookie and session handlers
    //Note: for sessionStore you can use any sessionStore module that has the .load() function
    //but I personally use the module 'sessionstore' to handle my sessionStores.
    var cookieParser = express.cookieParser('secret');
    var sessionStore = require('sessionstore').createSessionStore();
    
    app.configure(function(){
      app.set('port', process.env.PORT || 3000);
      //...truncate...//
      app.use(cookieParser);
      //make sure to use the same secret as you specified in your cookieParser
      app.use(express.session({secret: 'secret', store: sessionStore}));
      app.use(app.router);
    });
    
    app.get('/', function(req, res){
      res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
    });
    
    server.listen(app.get('port'), function(){
      console.log('Listening on port ' + app.get('port'));
    });
    
    var io = require('socket.io').listen(server);
    
    io.configure(function(){
      //use session.io to get our session data
      io.set('authorization', require('session.io')(cookieParser, sessionStore));
    });
    
    io.on('connection', function(socket){
      //we now have access to our session data like so
      var session = socket.handshake.session;
      console.log(session);
    });
    
    var express=require('express');
    var-app=express();
    var server=require('http')。createServer(应用程序);
    //设置cookie和会话处理程序
    //注意:对于sessionStore,您可以使用任何具有.load()函数的sessionStore模块
    //但我个人使用“sessionstore”模块来处理我的sessionstore。
    var cookieParser=express.cookieParser('secret');
    var sessionStore=require('sessionStore')。createSessionStore();
    app.configure(函数(){
    应用程序集('port',process.env.port | | 3000);
    //…截断//
    应用程序使用(cookieParser);
    //确保使用与cookieParser中指定的相同的机密
    使用(express.session({secret:'secret',store:sessionStore}));
    应用程序使用(应用程序路由器);
    });
    app.get('/',函数(req,res){
    res.send('io.connect();Connected');
    });
    server.listen(app.get('port'),function(){
    console.log('监听端口'+app.get('端口'));
    });
    var io=require('socket.io')。侦听(服务器);
    io.configure(函数(){
    //使用session.io获取会话数据
    set('authorization',require('session.io')(cookieParser,sessionStore));
    });
    io.on('连接',函数(套接字){
    //我们现在可以像这样访问会话数据
    var session=socket.handshake.session;
    console.log(会话);
    });
    
    req
    在Socket.IO连接处理程序中不可用。是的,我已经看过了,但它没有解释如何从
    重新存储
    访问信息。例如,我希望用户使用电子邮件和密码登录,然后在登录后使用会话数据保持登录。因此,在授权中,将他们的输入与Redis数据库进行比较,如果正确,则对他们进行授权,并将其添加到
    handshakeData
    变量中。所以他们的例子对我来说太模糊了。如果你能给我举个例子说明如何做到这一点,你将是我的英雄哈哈。)添加了更多可以帮助您的链接前3个链接只是指向socket.io github页面,我找不到您在那里提到的部分…这包括您的内容吗