bcrypt.genSalt и методы хэширования возвращают обещание, поэтому вам нужно дождаться.
Также я изменил на findOneAndUpdate на findByIdAndUpdate, который, на мой взгляд, более понятен в этом случае.
Можете ли вы попробовать сэтот код?
router.put(
"/edit",
[
auth,
[
check("name", "Name is required")
.not()
.isEmpty(),
check("email", "Please enter a valid email").isEmail(),
check(
"password",
"Please enter a password with 8 or more characters"
).isLength({ min: 8 })
]
],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
res.status(404).json({ errors: errors.array() });
}
const { email, password, name } = req.body;
const update = {
email,
password,
name
};
const salt = await bcrypt.genSalt(10);
update.password = await bcrypt.hash(password, salt);
try {
const user = await User.findByIdAndUpdate(req.user.id, update, {
new: true,
upsert: true
});
res.json(user);
} catch (err) {
console.error(err);
res.status(500).send("Server Error");
}
}
);