Я пытаюсь обновить свой пост в своей базе данных MongoDB, но он показывает следующее : Не удается прочитать свойства null (чтение «updateOne»)

#node.js #reactjs #mongodb

Вопрос:

Я пытаюсь обновить свой пост в своей базе данных MongoDB, но он показывает: Не удается прочитать свойства null (чтение «updateOne»)

 const router = require("express").Router(); const Post = require("../moduls/Post");  router.post("/", async (req, res) =gt; {  const newpost = Post(req.body);  try {  const savedPost = await newpost.save();  res.status(200).json(savedPost);   } catch (error) {  res.status(500).json(error)  }  });  

Здесь я пытаюсь написать код для обновления своего поста. Но это не работает.

 //Update Post router.put("/:id", async (req, res) =gt; {  // try {  const post = await Post.findById(req.params.id);  if (post.userId === req.body.userId) {  await post.updateOne({ $set: req.body })  }  else {  res.status(403).json("You can't update it")  }   // } catch (error) {  // res.status(500).json("Internal Error")  // } }) module.exports = router;  

Комментарии:

1. Я думаю, вам следует добавить дополнительную проверку существования записи перед ее обновлением. if(post amp;amp; (post.userId === req.body.userId)).

Ответ №1:

Исходя из вашего вопроса, в вашем коде есть несколько ошибок:

  • Всегда добавляйте проверку того, что операция прошла успешно, прежде чем двигаться дальше.
  • Используйте Post вместо post для выполнения операций.(Модель Пост Мангуста вместо экземпляра поста)
  • В вашем случае вам findOneAndUpdate не нужно сначала находить соответствующий пост, а затем обновлять его.
 router.put("/:id", async (req, res) =gt; {  try {  const postUpdated = await Post.findOneAndUpdate(  {  _id: mongoose.Types.ObjectId(req.params.id),  userId: mongoose.Types.ObjectId(req.body.userId) // assuming it is saved as a mongo id  },  req.body,  { new: true }  );   if (!postUpdated) {  throw new Error('could not update Post');  }  res.json(postUpdated);  } catch (e) {  res.sendStatus(500);  } });  

В качестве дополнения:

  • Ваша прокомментированная обработка ошибок на самом деле необходима из-за того, что Express не обрабатывает возвращенное обещание для вас.(Это то, что заставляет вас получить UnhandledPromiseRejectionWarning )
  • Ваш код также не предоставляет никакой формы проверки входящего запроса, возможно, вам захочется сначала проверить, какие данные вы получаете от клиента, прежде чем вставлять их в базу данных.