#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
) - Ваш код также не предоставляет никакой формы проверки входящего запроса, возможно, вам захочется сначала проверить, какие данные вы получаете от клиента, прежде чем вставлять их в базу данных.