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,所以meid之后你在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 未定义

passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?

Node + Express + Passport + Mongoose:req.user 未定义

使用 google-passport-oauth 登录后 req.user 未定义

req.user.displayname 未定义 Nodejs + passport = google oauth