Метод запроса исправления в Node.js и Mongoose - PullRequest
0 голосов
/ 17 февраля 2019

Для обновления я использую следующий работающий код:

router.put('/:id', async (req, res) => {
  const { error } = validateProduct(req.body); 
  if (error) return res.status(400).send(error.details[0].message);

  const product = await Product.findByIdAndUpdate(req.params.id, 
    { 
     name: req.body.name,
     description: req.body.description,
     category: req.body.category,
     tags: req.body.tags,
     withdrawn: req.body.withdrawn,
     extraData: {
       brand: req.body.extraData.brand,
       quantity: req.body.extraData.quantity,
       type: req.body.extraData.type
     } 
   }, 
   {new: true}
  );

  if (!product) return res.status(404).send('The product with the given ID was not found.');

  res.send(product);
});

Что я хочу сделать, это создать операцию Patch, которая обновляет только определенные поля, а не все из них, как обновление выше.Эти поля не являются стандартными, но они являются одним из вышеуказанных полей операции обновления.

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете попробовать этот фрагмент (хотя не проверял его локально).Идея состоит в том, чтобы обновить только те поля в Product, которые были упомянуты в req.body.Убедитесь, что ваш валидатор безопасен, иначе вы можете получить инъекцию nosql.

router.put('/:id', async (req, res) => {
  const { error } = validateProduct(req.body); 
  if (error) return res.status(400).send(error.details[0].message);

  const product = await Product.findById(req.params.id).exec();
  if (!product) return res.status(404).send('The product with the given ID was not found.');

  let query = {$set: {}};
  for (let key in req.body) {
    if (product[key] && product[key] !== req.body[key]) // if the field we have in req.body exists, we're gonna update it
       query.$set[key] = req.body[key];

  const updatedProduct = await Product.updateOne({_id: req.params.id}, query}).exec();

  res.send(product);
});

Также я уверен, что вы можете использовать lodash в строке, где я использую цикл for-in;)

Недостатком этого подхода является то, что для монго требуется 2 запроса, потому что для сравнения необходим реальный документ.Также операция обновления не запускает зацепки после сохранения вашей модели.Если они вам нужны - сначала вы должны найтиById (), обновить необходимые поля, а затем нажать .save () в самом документе, который вы нашли.Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...