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。