Ошибка [ERR_UNHANDLED_ERROR]: необработанная ошибка. («Неверные аргументы») - PullRequest
0 голосов
/ 04 марта 2020

Эта ошибка появляется, когда я хочу войти

события. js: 189

throw err; // Необработанное событие «ошибка»

^

Ошибка [ERR_UNHANDLED_ERROR]: необработанная ошибка. («Неверные аргументы»)

в Function.emit (события. js: 187: 17)

в E: \ My Drive \ sr c code \ node.js \ Версия \ regSys \ node_modules \ mongoose \ lib \ model. js: 4830: 13

в E: \ My Drive \ sr c code \ node.js \ Revision \ regSys \ node_modules \ mongoose \ lib \ query. js: 4390: 12

at process.nextTick (E: \ My Drive \ sr c code \ node.js \ Revision \ regSys \ node_modules \ mongoose \ lib \ query. js: 2869: 28) at process._tickCallback (internal / process / next_tick. js: 61: 11)

Приложение [nodemon] аварийно завершилось - ожидание изменений файла перед запуском ...

Схема (дБ. js)

const mongoose = require('mongoose');
const bcrypt = require('bcrypt-nodejs');

const stDB = mongoose.Schema({
    email : {
        type: String,
        required: true
    },
    password : {
        type: String,
        required: true
    }
});

stDB.methods.hashPassword = function(password){
    return bcrypt.hashSync(password, bcrypt.genSaltSync(5));
}
stDB.methods.comparePasswords = (password) => {
    return bcrypt.compareSync(password, this.password)
}


module.exports = mongoose.model('db', stDB);

config / passport. js

passport.use('local-signin' , new localStrategy({
    usernameField : 'email' ,
    passwordField : 'password' ,
    passReqToCallback : true ,
} , ( req , email , password ,  done)=>{


    User.findOne({email : email} , (err , user)=>{
        if(err){
            return done (err)
        }

        if (! user){
            return done( null , false , req.flash('signinError' , 'this user not found'))
        }
        if (! user.comparePasswords(password)){
            return done(null , false , req.flash('signinError' , 'wrong password'))
        }

        return done(null , user)
    })

}))

"bcrypt- nodejs": "0.0.3"

"паспорт": "^ 0.4.0"

"passport-local": "^ 1.0.0"

"узел": "10.16.1"

"express": "~ 4.16.1"

1 Ответ

0 голосов
/ 04 марта 2020

Почему у вас ошибка:
Ошибка Error [ERR_UNHANDLED_ERROR]: Unhandled error. ('Incorrect arguments') выдается bcrypt-nodejs при попытке сравнить пароль ha sh и строковый пароль без передачи необходимых аргументов. Эта часть вашего кода является виновником:

stDB.methods.comparePasswords = (password) => {
    return bcrypt.compareSync(password, this.password)
}

Очевидно, что вы передаете два аргумента в bcrypt.compareSync, чего он и ожидает, однако проблема в том, что вы используете функцию стрелки и мон goose методы схемы плохо работают с функциями стрелок, в документах :

не объявляется метод с использованием функций стрелок ES6 (=>). , Функции стрелок явно препятствуют связыванию этого, поэтому ваш метод не будет иметь доступа к документу.

Так что, хотя очевидно, что вы передаете два аргумента bcrypt.compareSync, только один из них допустим, другой (this.password) будет undefined.

Исправление:
Просто замените функцию стрелки на выражение функции:

stDB.methods.comparePasswords = function (password) {
    return bcrypt.compareSync(password, this.password)
}
...