【问题标题】:Using promises in mongoose for passport authentication在 mongoose 中使用 Promise 进行护照身份验证
【发布时间】:2017-01-02 13:40:55
【问题描述】:
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/user');

module.exports = function(passport){
  passport.use('local-signup', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
  },
  function(req, email, password, done){

    User.findOne({'local.username': email}).exec()
      .then(function(user) {
        console.log(user);
        if(user){
          return done(null, false, {message: 'Username already taken!'});
        }
        else{
          var newUser = new User();

          newUser.local.username = email;
          newUser.local.password = password;

          return newUser.save();
        }
      })
      .then(function(user) {
        console.log('DEBUG DEBUG DEBUG');
        done(null, user);
      })
      .catch(function(err) {
        done(err);
      });
  }
  ));

  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function(userid, done) {
      User.findById(userid).exec()
        .then(function(user) {
          done(user);
        });
  });
};

在我的情况下,无论是否调用 return newUser.save(),都会打印调试日志。 是否可以只在调用 return newUser.save() 时打印调试日志?

顺便说一句,我正在使用 passportJS 进行身份验证,并且对于我使用全局 es6 承诺覆盖 mongoose 默认承诺的承诺。

【问题讨论】:

    标签: node.js mongoose promise passport.js


    【解决方案1】:

    你的意思是这样吗?抱歉,如果有多余的括号或括号。我在文本框中进行了编辑。 :(

       User.findOne({'local.username': email}).exec()
          .then(function(user) {
    
            if(user){
              return done(null, false, {message: 'Username already taken!'});
            }
            else{
              var newUser = new User();
    
              newUser.local.username = email;
              newUser.local.password = password;
    
              return newUser.save()
                  .then(function(){
                      console.log('DEBUG DEBUG DEBUG');              
                      done(null, user);      
                  })
            }
          })
          .catch(function(err) {
            done(err);
          });
      }
      ));
    

    【讨论】:

    • 我同意您的解决方案。它使用从.save() 方法返回的promise,该方法同样有效,并且可能对某些人的javascript 编码风格更有利。不用说我喜欢你的短臂!投赞成票!
    • 您的解决方案是可行的,但如果我将 newUser.save().then() 放在其他范围内。代码将喜欢回调样式。如果promise被锁住会更干净吗?而不是把它放在其他范围内?
    • 不幸的是,在这种情况下它是必要的。但是您可以删除else,这将有助于减少嵌套。
    • 哦,好吧。那么在这种情况下,不可能进行链式承诺?
    • 您想要有条件地链接,这不是链接的工作方式。所以不行。 :(
    【解决方案2】:

    只需将您的调试消息放入newUser.save() 中的函数中

    User.findOne({'local.username': email}).exec()
      .then(function(user) {
        console.log(user);
        if(user){
          return done(null, false, {message: 'Username already taken!'});
        }
        else{
          var newUser = new User();
    
          newUser.local.username = email;
          newUser.local.password = password;
    
          return newUser.save(function() {
            console.log('SAVED!');
            console.log('DEBUG DEBUG DEBUG');
          });
        }
      })
      .then(function(user) {
        done(null, user);
      })
    

    【讨论】:

    • 我同意您的解决方案。我们几乎同时发布。你的方法使用了回调,这很好,但我相信 Promise 也会起作用,并且更符合他使用 ES6 Promise 的要求。无论哪种方式,都投赞成票!
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2015-09-06
    • 2020-08-27
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多