Если ваш второй пример - это то, что нужно, то ваша проблема - неправильное понимание того, как асинхронный код работает в 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 на самом деле не ожидает и не блокирует поток, это просто синтаксический сахар для обработки обещаний