如何修复比较密码的“ TypeError:cb不是函数”错误

时间:2019-04-27 10:07:58

标签: node.js mongodb express bcrypt

我已经开始将用户身份验证添加到我的应用程序中,并且在添加登录路由时,出现了错误“ TypeError:cb不是函数”。我知道它来自我的登录路线,因为其他所有路线都可以正常工作。

我已经尝试研究此问题,并尝试了一些我发现的修复程序,但均未奏效。所以我开始相信我已经在某个地方搞砸了,找不到了。

登录路线:

router.post('/login', function (req, res) {
    User.findOne({ username: req.body.username }, function (err, user) {
        if (err || user == null) {
            console.log(err);
            res.redirect('/login');
        }

        if (!user.comparePassword(req.body.password)) {
            req.flash('invalidDetails', 'Wrong username or password!');
            res.redirect('/login');
        } else {
            req.session.userId = user._id;
            req.flash('loggedIn', 'User ' + req.body.username + ' has been logged in!');
            return res.redirect('/');
        }
    });
});

用户模型:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    bcrypt = require('bcrypt'),
    SALT_WORK_FACTOR = 10;

var UserSchema = new mongoose.Schema({
    email: {
        type: String,
        unique: true,
        required: true,
        trim: true
    },
    username: {
        type: String,
        unique: true,
        required: true,
        trim: true
    },
    password: {
        type: String,
        required: true
    }
});

UserSchema.statics.authenticate = function (email, password, callback) {
    User.findOne({ email: email }).exec(function (err, user) {
        if (err) {
            return callback(err);
        } else if (!user) {
            var err = new Error('User not found.');
            err.status = 401;
            return callback(err);
        }
        bcrypt.compare(password, hash, function (err, result) {
            if (result === true) {
                return callback(null, user);
            } else {
                return callback();
            }
        });
    });
};

UserSchema.pre('save', function (next) {
    var user = this;

    // only hash the password if it has been modified (or is new)
    if (!user.isModified('password')) return next();

    // generate a salt
    bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) {
        if (err) return next(err);

        // hash the password along with our new salt
        bcrypt.hash(user.password, salt, function (err, hash) {
            if (err) return next(err);

            // override the cleartext password with the hashed one
            user.password = hash;
            next();
        });
    });
});

UserSchema.methods.comparePassword = function comparePassword(candidatePassword, cb) {
    bcrypt.compare(candidatePassword, this.password, function (err, isMatch) {
        if (err) {
            return cb(err);
        }

        cb(null, isMatch);
    });
};

var User = mongoose.model('User', UserSchema);
module.exports = User;

我希望它可以将密码与登录表单中输入的密码与数据库中存储的密码进行比较,如果密码正确无误,请登录用户,或者使用以下命令重定向回登录页面:如果密码不正确,则为invalidDetails Flash消息。

但是我实际上得到的是尝试登录时出现的“ TypeError:cb不是函数”错误。

1 个答案:

答案 0 :(得分:0)

您没有传递回调,这就是原因。

如果你想要一个基于 Promise 的方法,你可以这样写

AuthSchema.methods.comparePassword = function(candidatePassword) {
const currentPassword = this.password;
return new Promise((resolve, reject) => {
    bcrypt.compare(candidatePassword, currentPassword, function(err, isMatch) {
        if (err) return reject(err);
        resolve(isMatch);
    });
})
};

现在你可以用 await 调用它