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