我正在构建与 Express Session 的集成,并尝试在单独的 webhook 中对用户进行身份验证。所以我需要一种方法来更新请求之外的用户会话,因为这将是一个不同的请求。
我所做的是将会话 ID 传递给新请求,并使用 MongoClient 更新数据库中的会话。我记得 Express Session 只将 ID 存储在客户端,而数据存储在数据库中,所以我假设更新数据库就可以了。但情况似乎并非如此。我可以清楚地看到 MongoDB 上的会话已全部更新,但我一直在req.session.data
.
这是我所做的
所以我尝试的第一件事是使用这样的req.session.reload()
方法:
在 Node.js 和 express-session 中更改和刷新会话数据
但它仍然给我过时的数据,好像该函数什么也没做(它确实打印了日志,所以我认为它确实运行了)。
我尝试使用它使用store.get()
Express Session 中的方法,但它给了我undefined
会话。
所以作为最后的手段,我使用 MongoClient 直接获取会话数据并使用获得的数据更新会话。我对路由处理程序使用异步并等待 MongoClient 获取数据。它不等待 await 而只是继续投掷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,但什么也没发生。
而在这方面它使用了socket.io,store.get()
所以它也不能正常工作。
有人可以指导我如何让 Express Session 从数据库中更新,或者有没有办法从数据库中获取数据并以这种方式更新会话?