Я пытаюсь построить приложение регистрации в узле JS. здесь приложение аутентификации пароля не работает должным образом. когда я ввожу имя пользователя и пароль, это происходит после ошибки и останавливает сервер.

this is the error. 

введите описание изображения здесь

Вот код для аутентификации

 passport.use(new LocalStrategy( function(username, password, done) { User.getUserByUsername(username, function(err, user){ if(err) throw err; if (!user) { return done(null, false, {message: 'Unknown user'}); } User.comparePassword(password, user.password, function(err, isMatch){ if(err) throw err; if (isMatch) { return done(null, user); } else { return done(null, false, {message: 'Invalid password'}); } }); }); })); 

Этот код работает для неизвестного пользователя. но он не работает для сравнения имени пользователя и пароля. я не вижу здесь никакой ошибки. Я хочу помочь решить эту проблему.

Я нашел проблему здесь. это не вещи, касающиеся кода.

Дело в том, что я зарегистрировал двух пользователей с одинаковыми именами и паролями. затем, когда я попытался войти в систему с именем пользователя и одним паролем, возникла эта ошибка и остановка сервера.

Потому что возникает неловкая ситуация с поиском пароля к имени пользователя, который ввел пользователь. потому что есть два пароля с одинаковым именем пользователя.

В моем случае я использую социальную регистрацию / регистрацию. Когда пользователь регистрируется с помощью опции входа в систему, значение сохраненного пароля равно «NULL».

Поэтому я просто добавил эту маленькую проверку:

  comparePassword: function(password, user){ if (!user.password) return false; return bcrypt.compareSync(password, user.password); } 

В

«Модели / user.js»

Внутри сравнитьПароль

 module.exports.comparePassword = (candidatePassword, hash, callback) ={amp}gt; {...) 

Добавьте этот код:

 bcrypt.hash(candidatePassword, 10, (err, hash) ={amp}gt; { if(err) { throw err; } bcrypt.compare(candidatePassword, hash, (err, isMatch) ={amp}gt; { if(err) { throw err; } callback(null, isMatch); }); }); 

Здесь мы берем имя пользователя и пароль со страницы входа И находим нашего пользователя по имени пользователя из базы данных, а затем сопоставляем его зашифрованный пароль с введенным пользователем паролем.

 passport.use(new LocalStrategy( (username,password,done)={amp}gt; { db.users.findOne({username: username},(err, user)={amp}gt; { if(err) return done(err); if(!user) { return done(null,false,{message: 'Incorrect Username'}); } bcrypt.compare(password, user.password,(err,isMatch)={amp}gt; { if(err) return done(err); if(isMatch) { return done(null, user); } else { return done(null, false,{message: 'Incorrect Password'}); } }); }); } )); 

Вам также необходимо подать заявку на получение соли и пароля.

Как это,

 const salt = await bcrypt.genSaltSync(10); const password = await req.body.password;