我正在使用Passport.js(本地)和Firestore来创建网站的后端。一切正常,直到没有时间进行一些会话管理。 Passport.js文档。似乎建议会话序列化和反序列化与MongoDB一起使用。没有关于如何在其他NoSQL DB上实现它的任何说明。我确实试图实现自己,这引导我来到这里。
问题是Firestore返回的每个查询都是一个promise的形式,我无法访问.then()
类之外的结果,因此无法对它们进行序列化和反序列化,以便为各个用户创建会话ID。此外,我只是不可能只是通过调用user.id
来获取Firestore中文档的ID(但对于MongoDB来说它完全没问题)。
无论如何,我可以让Passport.js的会话功能与Firestore一起使用吗?
非常感谢任何帮助。
有关完整长度的代码,请参阅hastebin。
官方文件是什么。表明:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
我面临的情况:
passport.serializeUser(function(doc, done) {
done(null, doc.id);
});
passport.deserializeUser(function(doc_id, done) {
DBReg.doc(doc_id)
.get()
.then(doc => {
if (!doc.exists) {
console.log('Nope');
} else {
done(err, doc.data().name);
}
});
});
通过控制台记录req.session
使用MongoDB进行功能(工作)输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
passport: { user: '5afa5ded957b8187e111f966' } }
请注意以
开头的最后一行passport:
我正在使用Firestore的输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
现在
passport:
已经消失
不要问我为什么我没有使用Firestore提供的内置身份验证功能。这是我第一次使用Firestore,我正在寻找它的数据库功能;因此,由于无知,当我意识到Goggle还专门为Firestore提供了一个auth功能时,代码库已经完成了75%。
答案 0 :(得分:0)
我们发现express.js将会话存储在内存中。为了使会话持续存在,最好检查一下mongo-connect或redis-connect。