#node.js #mongodb #mongoose
Вопрос:
Всякий раз, когда я пытаюсь сравнить пароль для входа в систему, я получаю ошибку, и это было настоящее дерьмо. Я включил схему и код контроллера аутентификации, а также ошибку, которую он мне выдает. Ниже приведен код схемы:
const mongoose = require('mongoose');
const validator = require('validator');
const bcrypt = require('bcryptjs');
const userSchema = new mongoose.Schema({
name: {
type: String,
required: [true, 'Please tell us your name!'],
},
email: {
type: String,
required: [true, 'Please provide your email'],
unique: true,
lowercase: true,
validate: [validator.isEmail, 'Please provide a valid email'],
},
photo: String,
password: {
type: String,
required: [true, 'Please provide password'],
minlenght: 8,
select: false,
},
passwordConfirm: {
type: String,
required: [true, 'Please confirm your password'],
validate: {
//THIS ONLY WORKS ON CREATE AND SAVE!!!
validator: function (el) {
return el === this.password;
},
message: 'Passwords are not the same',
},
},
});
userSchema.pre('save', async function (next) {
//Only run this function if password was actually modified
if (!this.isModified('password')) return next();
//
this.password = await bcrypt.hash(this.password, 12);
this.passwordConfirm = undefined;
next();
});
userSchema.methods.correctPassword = async function(candidatePassword, userPassword) {
return await bcrypt.compare(candidatePassword, userPassword);
};
const User = mongoose.model('User', userSchema);
module.exports = User;
А ниже приведен контроллер аутентификации:
const jwt = require('jsonwebtoken');
const User = require('./../models/userModel');
const catchAsync = require('./../Utils/catchAsync');
const AppError = require('./../Utils/appError');
const signToken = (id) => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN,
});
};
exports.login = catchAsync(async (req, res, next) => {
const { email, password } = req.body;
// 1) Check if email and password exist
if (!email || !password) {
return next(new AppError('Please provide email and password', 400));
}
//2) Check if user exists amp;amp; password is correct
const user = await User.findOne({ email }).select(' password');
const correct = await user.correctPassword(password, user.password);
if (!user || !correct) {
return next(new AppError('Incorrect email or password', 401));
}
//3) If everything is ok, send token to client
const token = signToken(user._id);
res.status(200).json({
status: 'success',
token,
});
});
Below is the output:
«стек»: «Ошибка: Недопустимые аргументы: число, строкаn при _async (C:UsersRemmyekunDesktopNatoursNatoursnode_modulesbcryptjsdistbcrypt.js:286:46)n в C:UsersRemmyekunDesktopNatoursNatoursnode_modulesbcryptjsdistbcrypt.js:307:17n при новом обещании ()n в Object.bcrypt.compare (C:UsersRemmyekunDesktopNatoursNatoursnode_modulesbcryptjsdistbcrypt.js:306:20)n в model.UserSchema.methods.correctPassword (C:UsersRemmyekunDesktopNatoursNatoursmodelsuserModel.js:55:23)n в C:UsersRemmyekunDesktopNatoursNatoursControllersauthController.js:41:30n в процессах и проекциях (внутренний/процесс/task_queues.js:95:5)»