javascript - 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
。在搞砸并尝试了不同的事情之后,我意识到当我简单地不传递id
到getUserById()
. 但这肯定不是一件好事,对吧?
旁注:打印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})
)
如果有人能指出为什么我在尝试以正确的方式反序列化我的用户时遇到此问题,我将不胜感激。这是我第一次做任何类型的后端编码,即使只是走到这一步也是一段相当长的旅程。
解决方案
看起来您正在使用一个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
推荐阅读
- c# - 如何在 Visual Studio 中对 HTML 元素进行后端编码?
- python - 在 Python 中查找单词的类别
- jquery - 使用jQuery处理转发器内的按钮单击
- java - Android Retrofit 响应不等于 Postman 响应
- java - 在 webview 中查看 Firebase 存储 pdf 文件
- r - 从海量数据集中的邻接矩阵创建边缘列表
- apache-spark - 如何检测火花数据集中的循环
- java - 使用 @Configuration 时运行单元测试时出现 NoSuchBeanDefinitionException
- python - 根据字符串值创建分类列
- android - Android:在 JUnit 中传递上下文并使用共享首选项