首页 > 解决方案 > passport.deserializeUser 仅在不通过 'getUserById' 传递 'id' 时工作

问题描述

起初我的代码的序列化/反序列化部分看起来像这样

passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
passport.serializeUser((user, done) => done(null, user.id))
passport.deserializeUser((id, done) => {
   return done(null, getUserById(id))
});

但是我登录req.user后又回来了Promise { <pending> }。所以我然后尝试将我的代码更改为此

passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
passport.serializeUser((user, done) => done(null, user.id))
passport.deserializeUser((id, done) => {
   getUserById(id).then(user => {
      done(null, user);
   }).catch(err => {
   console.log(err)
      done(err);
   });
})

我希望在承诺上附加 a.then().catch()可以解决问题,但当时我无法登录,我意识到打印getUserById(id)返回了null。在搞砸并尝试了不同的事情之后,我意识到当我简单地不传递idgetUserById(). 但这肯定不是一件好事,对吧?

旁注:打印id总是返回登录的用户ID

这是我其余的初始化函数

function initialize(passport, getUserByEmail, getUserById) {
    const authenticateUser = async (email, password, done) => {
        const user = await getUserByEmail(email)
        console.log(email)
        if (user == null) {
        return done(null, false, { message: 'Incorrect email or password' })
    }
    try {
        if (await bcrypt.compare(password, user.password)) {
        return done(null, user)
    } else {
        return done(null, false, { message: 'Incorrect email or password' })
    }
    } catch (e) {
        return done(e)
    }
}

最后,我在 index.js 中定义电子邮件和 ID

const initializePassport = require('../passport-config')
initializePassport(
    passport,
    async (email) => await User.findOne({email: email}),
    async (id) => await User.findOne({id: id})
)

如果有人能指出为什么我在尝试以正确的方式反序列化我的用户时遇到此问题,我将不胜感激。这是我第一次做任何类型的后端编码,即使只是走到这一步也是一段相当长的旅程。

标签: javascriptnode.jsexpresspassport.js

解决方案


看起来您正在使用一个User对象来执行查询,但实际上deserializeUser您只是使用了一个名为getUserById. 我不清楚这是否是您的 User 模型的自定义包装器,但是为了获取 id 您可以使用.findById.

我建议更新块以使用用户对象来查询数据库。你也可以通过使用 async/await 来让事情变得更平坦,但它也应该与 .then 一起使用。

例子:

passport.deserializeUser(async (id, done) => {
  const user = await User.findById(id);
   return done(null, user);
});

模型参考:https ://mongoosejs.com/docs/api.html#model_Model.findById


推荐阅读