Недопустимые аргументы: число, строка

#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)»