【问题标题】:Node.js Mongoose replace order of passed arguments in findeOne() callbackNode.js Mongoose 替换 findeOne() 回调中传递参数的顺序
【发布时间】:2018-03-18 14:57:46
【问题描述】:

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

在文档中错误参数应该是第一个,查询的结果是第二个。我不能只是更改参数的名称并克服,因为护照会给我一个承诺错误。我该如何修复这个错误?

【问题讨论】:

    标签: node.js mongodb passport.js


    【解决方案1】:

    Promises 只将一个参数传递给它们的 .then() 回调,如下所示:

    User.findOne({ googleID: profile.id }).then(existingUser => { ...});
    

    如果出现错误,则 promise 会拒绝您使用 .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);
            });
      }
    ));
    

    不过,通常从 Promise 开始并将其转回常规回调是很麻烦的。您想一直使用 Promise(更简单的错误传播)。

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 2015-06-15
      • 2013-02-22
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多