Node.js 因为connect不支持';如果不再使用parseCookie方法,我们如何使用express获取会话数据?
在node.js和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.
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页面,我找不到您在那里提到的部分…这包括您的内容吗