我无法序列化用户,我不明白发生了什么
I am not able to serialize a user, I don't understand what happening
当我尝试登录我的网页时出现该错误,我在 Whosebug 和互联网上搜索该错误但我无法解决该错误。
我对此有一些疑问吗?
1:当我尝试记录 “用户” 数据时。但不是 return user obj 而是 return true。为什么?
2:在 serializeUser done 函数中为什么我们给出参数 user.id 而不是 user._id。因为 mongodb 有 _id 字段而不是那个 id 字段。
错误:
error image
这是我在终端机上得到的。
terminal img
代码片段:
passport.use(new passportLocal({
usernameField: 'email'
}, (email, password, done) => {
console.log(email, password);
usermodel.findOne({
email: email
}, (err, user_obj) => {
console.log("user object get by database", user_obj)
if (err) throw new Error(err);
if (!user_obj) {
return done(null, false, {
message: "There is no user with that ID."
});
} else if (user_obj) {
console.log(user_obj._id)
bcrypt.compare(password, user_obj.password, (err, varifiedUser) => {
if (err) throw new Error(err);
else if (varifiedUser) {
return done(null, varifiedUser);
} else {
return done(null, false, {
message: "Incorrect password!"
});
}
});
}
});
}));
passport.serializeUser((user, done) => {
console.log("user object serialize", user);
done(null, user._id);
});
passport.deserializeUser((user, done) => {
usermodel.findById(user.id, (err, id) => {
if (!err) {
done(null, user);
} else {
done(err);
}
});
});
router.post("/login", passport.authenticate('local', {
successRedirect: '/auth/quiz',
failureRedirect: '/auth/login'
}));
真的很抱歉我的语法不好。
bcrypt.compare
的第二个参数 returns 一个布尔值,告诉您密码是否匹配,不 用户数据。
我建议将其重写为删除可选回调的作业。
const match = bcrypt.compare(password, user_obj.password);
if (match) return done(null, user_obj);
这会将用户对象传递给 serializeUser
回调。
serializeUser 用于向 req.session.passport
属性 添加标识符,因此可以使用任何唯一值。我相信您可以使用 mongoose 访问 user.id 而不是 _id。
当我尝试登录我的网页时出现该错误,我在 Whosebug 和互联网上搜索该错误但我无法解决该错误。 我对此有一些疑问吗?
1:当我尝试记录 “用户” 数据时。但不是 return user obj 而是 return true。为什么?
2:在 serializeUser done 函数中为什么我们给出参数 user.id 而不是 user._id。因为 mongodb 有 _id 字段而不是那个 id 字段。
错误: error image
这是我在终端机上得到的。 terminal img
代码片段:
passport.use(new passportLocal({
usernameField: 'email'
}, (email, password, done) => {
console.log(email, password);
usermodel.findOne({
email: email
}, (err, user_obj) => {
console.log("user object get by database", user_obj)
if (err) throw new Error(err);
if (!user_obj) {
return done(null, false, {
message: "There is no user with that ID."
});
} else if (user_obj) {
console.log(user_obj._id)
bcrypt.compare(password, user_obj.password, (err, varifiedUser) => {
if (err) throw new Error(err);
else if (varifiedUser) {
return done(null, varifiedUser);
} else {
return done(null, false, {
message: "Incorrect password!"
});
}
});
}
});
}));
passport.serializeUser((user, done) => {
console.log("user object serialize", user);
done(null, user._id);
});
passport.deserializeUser((user, done) => {
usermodel.findById(user.id, (err, id) => {
if (!err) {
done(null, user);
} else {
done(err);
}
});
});
router.post("/login", passport.authenticate('local', {
successRedirect: '/auth/quiz',
failureRedirect: '/auth/login'
}));
真的很抱歉我的语法不好。
bcrypt.compare
的第二个参数 returns 一个布尔值,告诉您密码是否匹配,不 用户数据。
我建议将其重写为删除可选回调的作业。
const match = bcrypt.compare(password, user_obj.password);
if (match) return done(null, user_obj);
这会将用户对象传递给 serializeUser
回调。
serializeUser 用于向 req.session.passport
属性 添加标识符,因此可以使用任何唯一值。我相信您可以使用 mongoose 访问 user.id 而不是 _id。