Узел JS, использующий Bcrypt.Hash - пароль не хешируется после обновления - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь сделать функцию обновления для профилей пользователей по паролю.Я не знаю, почему, но пароль отлично хэшируется при входе в систему. Однако, когда я настраиваю функцию обновления с помощью route.put, пароль не хэшируется.Это все еще текст, когда я проверяю Почтальон.Я хотел бы хешировать пароль, когда пользователи изменяют свои пароли в текстовом виде.Вот что я сделал в Routes / API

router.put("/:_id", (req, res) => {
var update=req.body
const { errors, isValid } = validateEditProfile(req.body);

if (!isValid) {
return res.status(400).json(errors)
}

User.findByIdAndUpdate(req.params._id, update, { new: true })

.then(user =>res.json(user))
.catch(err => res.status(404).json({ update: false }));
});

Я также добавил строку в хэш-пароль, но он все еще не работает.

router.put("/:_id", (req, res) => {
var update=req.body
const { errors, isValid } = validateEditProfile(req.body);

if (!isValid) {
return res.status(400).json(errors)
}
var newPassword = req.body.password
bcrypt.hash(newPassword,(hash)=>{
req.body.password=hash
})
User.findByIdAndUpdate(req.params._id, update, { new: true })

.then(user =>res.json(user))
.catch(err => res.status(404).json({ update: false }));
 });

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Если ваш второй пример - это то, что нужно, то ваша проблема - неправильное понимание того, как асинхронный код работает в Node.

Результат hash не будет возвращен в том же контексте, что и findIdAndUpdate и, несмотря на подход закрытия, он также не обновит req.body.password вовремя.

Пара способов решить эту проблему, самый простой - просто переместить findIdAndUpdate в обратный вызов hash, этобудет гарантировать, что значение хеша обновляется заранее.Другой способ, учитывая, что bcrypt использует Promises, заключается в использовании синтаксиса async / await для «ожидания» результата хеширования перед вызовом findIdAndUpdate например,

router.put("/:_id", async (req, res) => {
  var update=req.body
  const { errors, isValid } = validateEditProfile(req.body);

  if (!isValid) {
    return res.status(400).json(errors)
  }
  req.body.password = await bcrypt.hash(req.body.password)
  User.findByIdAndUpdate(req.params._id, update, { new: true })
    .then(user =>res.json(user))
    .catch(err => res.status(404).json({ update: false }));
});

ПРИМЕЧАНИЕ.- async / await на самом деле не ожидает и не блокирует поток, это просто синтаксический сахар для обработки обещаний

0 голосов
/ 08 декабря 2018

Посмотрите на мой код

// route  get api/users/register
// desc   Register users route 
// access public

router.post("/register",(req,res) => {

const { errors, isValid } = validateRegisterInput(req.body)

// check the validation 
if(!isValid){
    return res.status(400).json(errors)
}

User.findOne({ email:req.body.email })
    .then(user => {
        if(user){
            errors.email = "Email already exist"
            return res.status(400).json(errors)
        }else{
            const newUser = new User({
                name : req.body.name,
                email : req.body.email,
                password : req.body.password

            });

            bcrypt.genSalt(10, (err,salt) => {
                bcrypt.hash(newUser.password, salt, (err,hash) => {
                    if(err){
                        throw err
                    }else{
                        newUser.password = hash;
                        newUser.save()
                            .then(user => res.json(user))
                            .catch(err => console.log(err));
                    }
                });
            });
        }
    })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...