Node.js Mongoose在findeOne()回调中替换传递参数的顺序

时间:2018-03-18 06:38:48

标签: node.js mongodb passport.js

我想使用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));
            };
        });
  }
));

在文档中,错误参数应该是第一个,第二个是查询结果。我不能只为参数更改名称并重新开始,因为护照会给我一个承诺错误。我该如何解决这个错误?

1 个答案:

答案 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(更简单的错误传播)。