我认为会话是为了保留用户用户计算机上的信息,直到它过期或我销毁它。我想要做的是,如果用户是匿名的,为他创建一个id,把它放在会话中,他在网站上的每个地方或点击我可以通过id存储属于匿名用户的DB记录中的东西。
我使用中间件检查用户是否在每次溃败时都使用护照登录,如果不是,我想创建req.session.anon
。我将req.session.anon
分配给保存anon时创建的ObjectId(请参阅代码)。第二次(页面刷新)用户应该有一个session.anon id,所以这个检查应该失败}else if(!req.session.anon){
但它没有,我创建了另一个带有新ID的记录。
app.use(function(req, res, next){
// console.log("req.user :::: ", req.user.local.username)
if(req.user){
app.locals.userid = req.user._id;
app.locals.username = req.user.local.username;
console.log("req.user is there")
}else if(!req.session.anon){
var anon = new Anon()
anon.save(function(err, data){
console.log(data)
req.session.anon = data._id
console.log("req.session.anon " , req.session.anon);// prints out the ID
})
}
next();
});
会话设置
app.use(session({secret : "thisisastring",
saveUninitialized : true,
resave : true
}));
编辑我想现在它与在回调中设置req.session.anon = data._id
有关。但是req.session是从控制台设置的
答案 0 :(得分:1)
会话通常通过cookie与浏览器相关联。
使用fiddler查看会话cookie是否写入响应流,以及cookie是否与下一个请求一起发回。
也许您需要在初始if子句中移动next()并将其移动到else..save回调方法的底部,以确保会话在关闭之前附加到响应。
答案 1 :(得分:0)
您有一个排序问题。我不确定这会导致你的会话问题,但是你的做法绝对不正确。
anon.save()
似乎是异步的。这意味着它完成了一段时间,然后调用它的回调。但是,在此之前你正在呼叫next()
。因此,这意味着在调用req.session.anon
时next()
将不会到位,这意味着此请求的后续处理程序将看不到req.session.anon
的值。可能是在添加req.session.anon
之前发生了自动重新保存,因此无法保存。
你可以像这样解决这个问题:
app.use(function(req, res, next){
// console.log("req.user :::: ", req.user.local.username)
if(req.user){
app.locals.userid = req.user._id;
app.locals.username = req.user.local.username;
console.log("req.user is there")
next();
}else if(!req.session.anon){
var anon = new Anon()
anon.save(function(err, data){
console.log(data)
req.session.anon = data._id
console.log("req.session.anon " , req.session.anon);// prints out the ID
next();
})
} else {
next();
}
});
等待更新会话后等待next()
。
由于不推荐使用resave
功能,因此在修改会话后手动保存会话也是有意义的:
app.use(function(req, res, next){
// console.log("req.user :::: ", req.user.local.username)
if(req.user){
app.locals.userid = req.user._id;
app.locals.username = req.user.local.username;
console.log("req.user is there")
next();
}else if(!req.session.anon){
var anon = new Anon()
anon.save(function(err, data){
console.log(data)
req.session.anon = data._id;
req.session.save(function() {
console.log("req.session.anon " , req.session.anon);// prints out the ID
next();
});
});
} else {
next();
}
});