Firestore + Passport.js 会话功能
Firestore + Passport.js session functionality
我正在使用 Passport.js(本地)和 Firestore 创建网站的后端。在进行会话管理之前,一切都运行良好。 Passport.js 文档。似乎暗示会话序列化和反序列化要与MongoDB结合使用。没有关于如何在其他 NoSQL 数据库上实现它的任何说明。我确实尝试实现自己,这让我来到了这里。
问题是 Firestore 返回的每个查询都是承诺的形式,我无法访问 .then()
class 之外的结果,因此无法序列化并反序列化它们以便为单个用户创建会话 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);
}
});
});
通过控制台日志记录使用 MongoDB 的功能(工作)输出 req.session
:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
passport: { user: '5afa5ded957b8187e111f966' } }
Note the last line where it starts with passport:
我使用 Firestore 得到的输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
Now the passport:
has disappeared
别问我为什么不用Firestore自带的auth功能。这是我第一次使用 Firestore,我正在使用它的数据库功能;因此,由于无知,当我意识到 Google 还专门为 Firestore 提供了身份验证功能时,代码库已经完成了 75%。
发现express.js在内存中存储了session。为了使会话持续存在,最好查看 mongo-connect 或 redis-connect。
我正在使用 Passport.js(本地)和 Firestore 创建网站的后端。在进行会话管理之前,一切都运行良好。 Passport.js 文档。似乎暗示会话序列化和反序列化要与MongoDB结合使用。没有关于如何在其他 NoSQL 数据库上实现它的任何说明。我确实尝试实现自己,这让我来到了这里。
问题是 Firestore 返回的每个查询都是承诺的形式,我无法访问 .then()
class 之外的结果,因此无法序列化并反序列化它们以便为单个用户创建会话 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);
}
});
});
通过控制台日志记录使用 MongoDB 的功能(工作)输出 req.session
:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
passport: { user: '5afa5ded957b8187e111f966' } }
Note the last line where it starts with
passport:
我使用 Firestore 得到的输出:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
flash: {},
Now the
passport:
has disappeared
别问我为什么不用Firestore自带的auth功能。这是我第一次使用 Firestore,我正在使用它的数据库功能;因此,由于无知,当我意识到 Google 还专门为 Firestore 提供了身份验证功能时,代码库已经完成了 75%。
发现express.js在内存中存储了session。为了使会话持续存在,最好查看 mongo-connect 或 redis-connect。