由于连接不再使用parseCookie方法,我们如何使用express来获取会话数据?
在node.js和express中,有很多例子展示了如何获取会话数据。
- Node.js和Socket.io
- Express和Socket.io – 捆绑在一起
- Socket.io和Session?
正如您在访问第三个链接时可以看到的那样,它是一个指向StackOverflow的链接。 有一个很好的答案,但正如在@UpTheCreek的评论中指出的,连接不再有parseCookie方法。 我也遇到了这个问题。 我find的所有教程都使用了connect的parseCookie
方法,该方法现在不存在。 所以我问他怎么才能得到会话数据,他说他不知道最好的方法,所以我想我会在这里发布这个问题。 当使用express@3.0.0rc4
, socket.io
和redis
,我们如何获取会话数据并使用它来授权用户? 我已经能够使用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); });
你的问题:
- 我如何通过RedisStore更新/更改cookie?
- 它看起来像会话数据只保存在cookie中。 如果有人closures了cookies,我怎样才能跟踪页面之间的用户信息?
Cookies /会话/ RedisStore想法:
- 通常,您只有一个Cookie,即会话ID
- 所有用户状态都存储在服务器上的“会话”,可以通过会话IDfind
- 您可以使用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思想:
- 你的第二个问题关于没有cookies的会议。 这个有可能。
- 基本上,您将会话ID放在发送给服务器的每个请求的url上。
- 我坚信大多数人都允许cookies。
- 如果这是一个要求,谷歌: “没有cookie的会话”
会话数据可用于:
req.session