我想使用Mongoose将我的护照oAuth记录保存到数据库,或者当它已经存在时忽略它。但是我的then()回调函数切换传递参数的顺序并放置查询结果而不是错误。
passport.use(new GoogleStrategy({
clientID: confKeys.googleAuth.client_id,
clientSecret: confKeys.googleAuth.client_secret,
callbackURL: confKeys.googleAuth.redirect_uris[0]
},(accessToken, refreshToken, profile, done) => {
User.findOne({ googleID: profile.id }).then((err, existingUser) => {
console.log(existingUser) // here I get undefined even if user exists in database
console.log(err)// here I get data for the user
if(existingUser){
done(err, existingUser);
}else{
console.log('new user');
new User({googleID: profile.id}).save()
.then((err,user) => done(err, user));
};
});
}
));
在文档中,错误参数应该是第一个,第二个是查询结果。我不能只为参数更改名称并重新开始,因为护照会给我一个承诺错误。我该如何解决这个错误?
答案 0 :(得分:1)
Promise只会将一个参数传递给他们的.then()
回调,如下所示:
User.findOne({ googleID: profile.id }).then(existingUser => { ...});
如果出现错误,那么承诺会拒绝您使用.catch()
方法单独捕获的内容,如下所示:
User.findOne({ googleID: profile.id }).then(existingUser => {
console.log(existingUser);
}).catch(err => {
console.log(err);
});
您可以在代码中使用它:
passport.use(new GoogleStrategy({
clientID: confKeys.googleAuth.client_id,
clientSecret: confKeys.googleAuth.client_secret,
callbackURL: confKeys.googleAuth.redirect_uris[0]
},(accessToken, refreshToken, profile, done) => {
User.findOne({ googleID: profile.id }).then(existingUser => {
console.log(existingUser);
if(existingUser){
return existingUser;
} else {
console.log('new user');
return new User({googleID: profile.id}).save();
};
}).then(user => {
done(null, user);
}).catch(err => {
done(err);
});
}
));
虽然,一般来说,从承诺开始并将它们变回常规回调是很混乱的。您希望一直使用promises(更简单的错误传播)。