userSchema.methods 猫鼬中未调用函数

userSchema.methods function is not getting called in mongoose

我写了userSchema.methods.generateAuthToken()函数如下

UserSchema.methods.generateAuthToken = async function()
{
    const token = jwt.sign({_id: this._id.toString()}, "ThisIsSecret");
    this.tokens = this.tokens.concat({token});
    await this.save();
    return token;
}

我在 authenticating with google 时在我的代码中调用此函数。以下是google验证码

passport.use(new GoogleStrategy({
    clientID: CLIENT_ID,
    clientSecret: CLIENT_SECRET,
    callbackURL: "http://localhost:8000/auth/google/notepad"
  },
  async function(accessToken, refreshToken, profile, email, cb) {
    try
    {
      var user = await User.find({googleId: email.id});
      if(user.length === 0)
      {
        const user = new User({googleId: email.id, fullName: email.displayName, email: email.emails[0].value});
        await user.save();
      }
      return cb(undefined, user);
    }
    catch(err)
    {
      return cb(err, undefined);
    }
  }
));

router.get('/auth/google', passport.authenticate('google',{scope: ['profile','email']}));
router.get('/auth/google/notepad', 
  passport.authenticate('google', { failureRedirect: '/' }),
  async function(req, res) {
    try
    {
      const token = await req.user.generateAuthToken();
      res.cookie('authToken', token);
    }
    catch(err)
    {
      console.log(err);
    }
    res.redirect('/')
  });
router.get('/',(req,res)=>
{
    res.send();
})

出于某种原因我不会使用 findOrCreate() 方法。相反,我通过使用 mongoose 的 find() 方法检查用户是否已经存在。问题是,当用户不存在时,会调用 req.user.generateAuthToken 方法,但当用户已经存在时,它会说 generateAuthToken 方法不存在 。每次都应该运行。

您应该添加这部分代码,以便 passport 保存您的用户信息。

passport.serializeUser((user,done)=>{
done(null,user.id)
})
passport.deserializeUser((id,done)=>{
User.findById(id,(err,user)=>done(err,user))
})

如果您使用的是 express

,请不要忘记在主要路线中添加以下行
app.use(passport.initialize());

In a Connect or Express-based application, passport.initialize() middleware is required to initialize Passport. If your application uses persistent login sessions, passport.session() middleware must also be used.

check the link for more info.