由于连接不再使用parseCookie方法,我们如何使用express来获取会话数据?

在node.js和express中,有很多例子展示了如何获取会话数据。

  • Node.js和Socket.io
  • Express和Socket.io – 捆绑在一起
  • Socket.io和Session?

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

 warn - handshake error Error 

从我读过的东西看来,这听起来不是一个永久的解决scheme。


UPDATE

好的我得到了session.socket.io在我的服务器上工作。 正如我怀疑的那样,我被困在授权的地步。 我想我可能会这样做是错误的,所以请随时纠正我。 在我的Redis数据库中,我将获得用户的信息。 他们第一次login时,我想更新他们的cookie,以便包含他们的用户信息。 然后下次他们回到网站,我想检查他们是否有一个cookie,如果用户信息在那里。 如果不在那里,我想把它们发送到login屏幕。 在login屏幕上,当用户提交信息时,会根据Redis数据库对该信息进行testing,如果匹配,则会使用用户信息更新cookie。 我的问题是这些:

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

2)看起来会话数据只保存在cookie中。 如果有人closures了cookies,我怎样才能跟踪页面之间的用户信息?

这是我的适用代码:

 //...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){ ... }); 

看看socket.io的维基 。 尤其是configurationSocket.IO和授权和握手的部分 。

它演示了如何在RedisStore使用socket.io,并提供了两种不同的授权方法。

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

  • 连接问题#588
  • socket.io和express 3
  • session.socket.io模块
  • socket.io-express库

在切换到session.socket.io一段时间后,由于加载会话信息时模块的asynchronous特性,遇到了一些问题。 所以我最终创build了一个名为session.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); }); 

你的问题:

  1. 我如何通过RedisStore更新/更改cookie?
  2. 它看起来像会话数据只保存在cookie中。 如果有人closures了cookies,我怎样才能跟踪页面之间的用户信息?

Cookies /会话/ RedisStore想法:

  1. 通常,您只有一个Cookie,即会话ID
  2. 所有用户状态都存储在服务器上的“会话”,可以通过会话IDfind
  3. 您可以使用Redis作为会话数据的后端存储。
  4. Redis将允许你保持会话状态,即使你的服务器重启(好事)
  5. 您可以在会话中存储一堆数据(req.session.key = value)
  6. 存储在会话中的所有数据将持续到用户注销或会话过期

示例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思想:

  1. 你的第二个问题关于没有cookies的会议。 这个有可能。
  2. 基本上,您将会话ID放在发送给服务器的每个请求的url上。
  3. 我坚信大多数人都允许cookies。
  4. 如果这是一个要求,谷歌: “没有cookie的会话”

会话数据可用于:

 req.session