所以这是我的代码,用于显示user session
是否存在,如果存在,它将使用文件呈现用户信息,以便在此显示已登录的用户信息。
app.get('/', async(req, res) => {
if(req.session.user && req.cookies.user_sid){
let user = await User.findOne({username: req.session.user.username});
res.render('index', {user});
} else {
res.render('index');
}
});
但是现在我想显示用户信息和其他路线。因此,我认为再次重复if语句将是愚蠢的。有什么选择吗?
答案 0 :(得分:0)
最好重复该语句并再次进行数据库调用。在第一个请求和任何后续请求之间的时间内,用户可能已注销(例如,由于cookie过期),或者用户数据可能已在数据库中更改,因此最好不要缓存数据并每次都进行检查。
答案 1 :(得分:0)
方法1
添加用户详细信息中间件,该中间件检查会话中用户详细信息是否可用,然后如果不可用则更新会话对象。这样可以避免在路由之间重复调用db。
3
您可以参考9
或app.use(function (req, res, next) {
if(req.session && req.session.userDetails === undefined){
const userDetails = await User.findOne({username: req.session.user.username});
req.session.userDetails = userDetails || undefined;
//optional
req.user = {};
Object.assign(req.user, req.session.userDetails);
}
next()
})
在所有路由中传递userDetails,类似
req.user
方法2
您还可以在用户成功登录并在所有路由中使用会话引用时将用户详细信息保存在会话中,例如
req.session.userDetails