【发布时间】:2021-05-28 09:11:20
【问题描述】:
我正在构建与 Express Session 的集成,并尝试在单独的 webhook 中对用户进行身份验证。所以我需要一种方法来更新请求之外的用户会话,因为这将是一个不同的请求。
我所做的是将会话 ID 传递给新请求,并使用 MongoClient 更新数据库中的会话。我记得 Express Session 只将 ID 存储在客户端,而数据存储在数据库中,所以我假设更新数据库就可以了。但情况似乎并非如此。我可以清楚地看到 MongoDB 上的会话已全部更新,但我一直在 req.session.data 中获取过时的数据。
这就是我所做的
所以我尝试的第一件事是使用req.session.reload() 方法,如下所示:
Updating express-session sessions
change and refresh session data in Node.js and express-session
但它仍然给我过时的数据,好像该函数什么也没做(它确实打印了日志,所以我认为它确实运行了)。
我尝试使用这个使用 Express Session 中的 store.get() 方法,但它给了我 undefined 会话。
Express load Session from Mongo with session_id
所以作为最后的手段,我使用 MongoClient 直接获取会话数据并使用获得的数据更新会话。我对路由处理程序使用异步并等待 MongoClient 获取数据。它不会等待等待,而是继续抛出undefined。我认为这是我的代码错误,但我能够使用代码获取用户数据,它确实等待 MongoClient 获取数据,但不知何故它不适用于会话数据。
这是我的部分代码:
app.router.get('/login', async function (req, res, next) {
req.session.auth = await mongo.getCookie(req.session.id).auth;
req.session.user = await mongo.getCookie(req.session.id).user;
console.log('Login Action', req.session.id, req.session.auth, req.session.user);
}
module.exports.getCookie = async function getCookie(identifier) {
try {
let database = client.db('database');
let collection = await database.collection('sessions');
let result = await collection.findOne({ _id: identifier }, function(err, res) {
if (err) throw err;
return res;
});
return result;
}
catch (err) {
console.error(err);
return null;
}
}
这是我检查过的其他答案
这个只更新过期时间,所以我认为它对我不起作用,我确实将 resave 设置为 false,这样它就不会尝试保存每个请求,因为它保存到我认为它有的数据库与更新无关,我尝试将其设置为 true,但没有任何反应。
Renewing/Refreshing Express Session
在这方面它使用了 socket.io 和 store.get(),所以它不能正常工作。
How to access session in express, outside of the req?
有人可以指导我如何让 Express Session 从数据库中更新,或者有没有办法从数据库中获取数据并以这种方式更新会话?
【问题讨论】:
标签: node.js mongodb express-session connect-mongo