我试图清理我的身份验证以使用Promise
而不是使用多个嵌套回调。当我的函数涉及简单的Mongoose查询时,我设法做到这一点,但一直试图将Promise
应用于Passport.js
Strategy
。
如果我将localLogin
函数转换为基于Promise
的函数,并且我的ESLinter对多个return done(...)
调用不太满意,那么会非常有用吗。
以下是代码:
UserSchema.methods.comparePassword = function (clientPassword, callback) {
bcrypt.compare(clientPassword, this.password, (err, isMatch) => {
if (err) return callback(err);
return callback(null, isMatch);
});
};
const localLogin = new LocalStrategy(localOptions, (username, password, done) => {
User.findOne({ username }, (err, user) => {
if (err) return done(err);
if (!user) return done(null, false);
user.comparePassword(password, (err, isMatch) => {
if (err) return done(err);
if (!isMatch) return done(null, false);
return done(null, user);
});
});
});
passport.use(localLogin);
然后将其用作中间件,如下所示:
const requireLogin = passport.authenticate('local', { session: false });
router.route('/login')
.post(requireLogin, authController.login);