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.
我写了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.