Passport req.user 返回 CastError: Cast to ObjectId failed for value " _id: 'me', active: true &qu
Posted
技术标签:
【中文标题】Passport req.user 返回 CastError: Cast to ObjectId failed for value " _id: \'me\', active: true " at path "_id" for model "user"【英文标题】:Passport req.user returns CastError: Cast to ObjectId failed for value " _id: 'me', active: true " at path "_id" for model "user"Passport req.user 返回 CastError: Cast to ObjectId failed for value " _id: 'me', active: true " at path "_id" for model "user" 【发布时间】:2021-04-20 22:56:14 【问题描述】:我正在尝试让用户使用 Passport 持久登录,实际上我可以登录我的应用程序, 但是当我尝试使用 req.user 保持登录时,在客户端控制台中它返回我 html 代码,在 Postman 控制台中它返回 CastError: Cast to ObjectId failed for value " _id: 'me', active:模型“user”的路径“_id”处的 true ”。
enter image description here
enter image description here
我多次使用本地护照,但这是我第一次将它与 mongoAtlas 数据库一起使用,我不知道这是否有意义,但我提到了它
我的护照配置:
passport.serializeUser((user, done) => done(null, user.id));
passport.deserializeUser((id, done) =>
User.findById(id)
.then((user) => done(null, user)) // req.user = user
.catch(done)
);
passport.use(
new LocalStrategy(
usernameField: "email",
passwordField: "password",
, function(email, password, done)
User.findOne( email )
.then(user =>
if(!user) return done(null, false)
user.comparePassword(password, (err, isMatch) =>
if(err) throw err;
if(!isMatch) return done(null, false);
return done(null, user)
)
)
.catch(done);
)
)
路由和控制器:
router.post("/login",passport.authenticate("local"), UserController.login)
router.post("/logout", UserController.logout)
router.get("/me", UserController.check) // <-----route to persist
//----------------Controllers-----------------------------
login(req, res, next)
console.log(req.user);
res.send(req.user)
,
logout(req, res, next)
req.logOut()
res.sendStatus(200)
,
check(req, res, next)
if(req.user)return res.send(req.user)
res.sendStatus(401)
Github 仓库:https://github.com/seriann/writeYourTabs
【问题讨论】:
如果您的问题没有解决,请留言,如果我的回答是真的,请采纳,谢谢 【参考方案1】:你的请求是.../api/users/me
你在服务器中的路由是.../api/users/:id
,所以me
是id
之后你在usersController
中使用它:
findById(req,res,next)
User.findById(_id:req.params.id, active:true)
.then(user => res.send(user))
.catch(err => next(err))
,
当你想使用findById()
时,你必须传递一个猫鼬objectId()
而不是String
,
所以可以使用findOne()
或将objectId 传递给findById()
【讨论】:
哦,所以我的路线“/api/users/:id”与“/api/users/me”发生冲突,谢谢! 如果我的回答是正确的,请接受我的回答。谢谢以上是关于Passport req.user 返回 CastError: Cast to ObjectId failed for value " _id: 'me', active: true &qu的主要内容,如果未能解决你的问题,请参考以下文章
在 React (ES6) 中访问 Passport 的 req.user? API 调用将 req.user 返回为未定义
passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?
Node + Express + Passport + Mongoose:req.user 未定义