【问题标题】:PassportJS just hangs after creating a userPassportJS 只是在创建用户后挂起
【发布时间】:2016-05-19 00:01:07
【问题描述】:

在我使用护照注册用户后,屏幕只是挂起,并且不会将我重定向到成功重定向中设置的屏幕:

模型/user.js

var bcrypt = require('bcrypt');

module.exports = function(sequelize, DataType){

  var User = sequelize.define('User', {
    name: DataType.STRING,
    localPassword: DataType.STRING,
    lastName: DataType.STRING,
    localEmail: DataType.STRING,
    cellNumber: DataType.INTEGER
  },
      {
        instanceMethods: {
          validPassword: function(password){
              return bcrypt.compareSync(password, this.password);
          }
        }
      }
  );
    return User;
};

路由/index.js

router.post('/register', passport.authenticate('local-signup', {
  successRedirect : '/',
  failureRedirect : '/err',
  failureFlash : true
}));

config/passportConfig.js

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

passport.deserializeUser(function(id, done) {
    model.User.findById(id, function(err, user){
        done(null, user);
    });
});


passport.use('local-signup', new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true
    },
    function(req, email, password, done) {
        model.User.findOne({
            where: {
                localEmail: email
            }
        }).then(function(existingUser) {
                if (existingUser) {
                    return done(null, false, req.flash('loginMessage', 'That email is already taken.'));
                }
                else {
                    var hash = bcrypt.hashSync(password, 8);
                    var newUser = model.User.build({name: req.body.name, lastName: req.body.lastName, localEmail: req.body.email, cellNumber: req.body.cellNumber, localPassword: hash});
                    newUser.save().then(function(){
                        done(null, newUser);
                    }).catch(function(err){
                        done(null, false, req.flash('loginMessage', err))
                    });
                }
            })
            .catch(function (e) {
                done(null, false, req.flash('loginMessage',e.name + " " + e.message));
            })
    }));

所以基本上发生的事情是它在数据库中创建条目,然后它停留在注册屏幕上并加载。它说等待本地主机,但永远持续下去。我是新来的护照和续集,任何帮助将不胜感激。

【问题讨论】:

  • 注意您的 bcrypt 部分:您应该为密码播种,通过从同步散列函数 (hashSync(data, salt)) 切换到异步版本可以轻松提高性能。 (hash(data, salt, callback))(因为异步版本不会停止执行)。你现在正在做的是使用8 作为盐,它是弱且非随机的。 (您可能想使用8 作为genSalt 的输入)

标签: node.js express passport.js sequelize.js


【解决方案1】:

我相信你的问题出在这个代码块上:

newUser.save().then(function(){
   done(null, newUser);
})

由于您调用 done 但没有返回它,Bluebird(续集使用的 promise 库)将这个 promise 视为返回 undefined。因此,它会并行运行其余代码,而无需等待它解决。

尝试在语句中添加返回:

newUser.save().then(function(){
    return done(null, newUser);
})

【讨论】:

  • 您好,感谢您的回复。我确实试过这个。但它似乎仍然卡住了。页面一直在加载,它说:等待本地主机....
  • 嗨@AndreCoetzee 我和你在哪里遇到同样的问题,想知道你是如何解决这个问题的stackoverflow.com/questions/50715236/… 任何指针表示赞赏,谢谢
猜你喜欢
  • 2018-12-07
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多