Пн goose - findByIdAndUpdate и req.body удаляют значения ключей - PullRequest
0 голосов
/ 08 мая 2020

У меня есть модель с множеством ключей / значений и маршрутом PUT для обновления модели. Я хочу иметь возможность отправлять req.body в метод mon goose findByIdAndUpdate.

Например, вот часть модели.

"generalInfo": {
    "tailNum": 1231231231231,
    "model": "sd9ia0da",
    "maxGasFuel": 1286123,
    "wingSurfaceArea": 123,
    "thrust": 123123,
    "takeOffSpeed": 123,
    "coeficientOfLift": 12334
}

Когда я отправляю запрос на обновление значения tailNum, он стирает все остальное в объекте generalInfo и оставляет только ключ / значение tailNum.

Вот мой код для запроса PUT.

// * @route   PUT /api/aircraft/:id
// ? @desc    Update an aircraft by ID
// ! @access  Private
router.put("/:id", auth, async (req, res) => {
  try {
    const dbAircraft = await Aircraft.findByIdAndUpdate(
      req.params.id,
      req.body,
      { new: true, runValidators: true }
    );

    res.json(dbAircraft);
  } catch (err) {
    console.log(err);
    res.status(500).send(`Server error`);
  }
});

Я знаю, что могу деструктурировать значения req.body и отправить их в настраиваемый объект вручную, но в этой модели слишком много значений, чтобы это было жизнеспособным.

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Ваша реализация кажется неправильной. Используйте

router.put("/:id", auth, async (req, res) => {
  try {
    const dbAircraft = await Aircraft.findByIdAndUpdate(
      req.params.id,
      {$set: req.body},
      { new: true, runValidators: true }
    );

    res.json(dbAircraft);
  } catch (err) {
    console.log(err);
    res.status(500).send(`Server error`);
  }
});
0 голосов
/ 08 мая 2020
router.put("/:id", auth, async (req, res) => {
  try {
    const dbAircraft = await Aircraft.findByIdAndUpdate(
      req.params.id,                     // «Object|Number|String» value of _id to query by
      { ...req.body },                   // «Object»
      { new: true, runValidators: true } // «Object» optional see https://mongoosejs.com/docs/api.html#query_Query-setOptions
    );
  // Example: Model.findByIdAndUpdate(123456, { name: 'my name' }, { new: true, runValidators: true })
  // Example: Model.findByIdAndUpdate({ _id: 123456 }, { name: 'my name' }, { new: true, runValidators: true })

    res.json(dbAircraft);
  } catch (err) {
    console.log(err);
    res.status(500).send(`Server error`);
  }
});
0 голосов
/ 08 мая 2020

Можно отправить req.body как объект, например:

router.put("/:id", auth, async (req, res) => {
  try {
    let update = req.body;
    const dbAircraft = await Aircraft.findByIdAndUpdate(
      {req.params.id,
       update,
      { new: true, runValidators: true }
    );

    res.json(dbAircraft);
  } catch (err) {
    console.log(err);
    res.status(500).send(`Server error`);
  }
});

//OR
router.put("/:id", auth, async (req, res) => {
  try {
    const dbAircraft = await Aircraft.findByIdAndUpdate(
      req.params.id,
      {req.body},
      { new: true, runValidators: true }
    );

    res.json(dbAircraft);
  } catch (err) {
    console.log(err);
    res.status(500).send(`Server error`);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...