Как исправить ошибку «TypeError: cb is not function» для сравнения паролей - PullRequest
0 голосов
/ 27 апреля 2019

Я начинаю добавлять аутентификацию пользователя в свое приложение, и при добавлении маршрута входа в систему я получаю сообщение об ошибке «Ошибка типа: 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флеш-сообщение, если пароль неверный.

Но на самом деле я получаю сообщение об ошибке «TypeError: cb is not function» при попытке войти в систему.

...