Для моего маршрута редактирования пользователя мне нужно будет обработать ряд различных возможных обстоятельств.Пользователь может обновить свой профиль и изменить только свой адрес электронной почты или пароль, но он также может обновить целый ряд другой информации профиля одновременно.
Преимущество findOneAndUpdate
состоит в том, что вы можете передать объект обновления, и он изменит только те поля запроса, которые отличаются от сохраненных данных.Это замечательно!Одна ОГРОМНАЯ проблема - этот запрос по какой-то причине обходит валидаторы и промежуточное ПО (даже при runValidators=true
он обходит ловушки предварительного сохранения, что означает, что обновления пароля обходятся в зашифрованном виде).
Таким образом, решение, которое я вижу повсюду, состоит в том, чтобы сделать findOne
или findById
, обновить поля вручную, а затем запустить user.save()
.
Однако, с довольно сложной пользовательской записью, это означает, что мой маршрут будет выглядеть примерно так и будет очень сложно поддерживать:
exports.editUser = async function(req, res, next) {
try {
const id = req.params.id;
let user = await db.User.findById(id);
user.email = req.body.email;
user.fullName = req.body.fullName;
user.password = req.body.password;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
user.otherField = req.body.otherField;
let updatedUser = await user.save();
return res.status('200').json(user);
}
Есть ли способ имитировать поведениепередать объект обновлений в Mongoose, где я могу просто дать ему req.body
и позволить ему обновлять только поля, которые отличаются?