Как я могу разумно обновить документ Mongoose на основе переменных данных запроса? - PullRequest
0 голосов
/ 20 июня 2019

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

Преимущество 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 и позволить ему обновлять только поля, которые отличаются?

1 Ответ

1 голос
/ 20 июня 2019

https://lodash.com/docs/4.17.11#merge

_. Merge (пользователь, req.body)

Это объединит ** ВСЕ **.Используйте только если вы не заботитесь о безопасности.

Чтобы ограничиться определенными полями, не сходя с ума:

const { f1, f2, f3 } = req.body;
_.merge(user, { f1, f2, f3}) 

Или обратитесь к этому: https://lodash.com/docs/4.17.11#pick
Немного неочевидная особенность в lodash.

_.merge(user, _.pick(req.body, ['f1', 'f2', 'f3']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...