Удаление комментариев определенного поста в блоге - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь удалить все комментарии, которые являются частью определенного сообщения в блоге, которое скоро будет удалено с помощью mongoose.Я не очень понимаю, почему мой код не работает.

const commentSchema = new mongoose.Schema({
  message: { type: String, required: true },
  likes: { type: Number, default: 0 },
  parentBlog: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: "Blog"
  },
  commenter: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: "User"
  }
});

router.delete("/:title_url", checkAuth, (req, res) => {
  const successMessage = "Successfully deleted blog post.";
  const errorMessage = "Error in deleting blog post.";
  Blog.findOne({ title_url: req.params.title_url })
    .then(foundBlog => {
      Comment.deleteMany({
        parentBlog: foundBlog._id
      });
      foundBlog.remove();
      console.log(foundBlog);
      return res.status(200).json({ message: successMessage });
    })
    .catch(res.status(500).json({ message: errorMessage }));
});

Файл console.log регистрируется правильно, прямо перед тем, как я получаю следующую ошибку:

(node:3108) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Редактировать: Вот мое окончательное рабочее решение.

// delete Blog Post route
router.delete("/:title_url", checkAuth, (req, res) => {
  const successMessage = "Successfully deleted blog post.";
  const errorMessage = "Error in deleting blog post.";
  // delete Post
  Blog.findOneAndRemove({ title_url: req.params.title_url })
    .populate("comments")
    .then(async foundBlog => {
      // delete Comment references from Commenters
      await foundBlog.comments.forEach(async comment => {
        await User.findByIdAndUpdate(comment.commenter._id, {
          $pull: { comments: comment._id }
        });
      });
      // delete Post reference from Post Author
      await User.findByIdAndUpdate(foundBlog.author, {
        $pull: { blogs: foundBlog._id }
      });
      // delete all child Comments
      await Comment.deleteMany({
        parentBlog: foundBlog._id
      });
      return res.status(200).json({ message: successMessage });
    })
    .catch(() => res.status(500).json({ message: errorMessage }));
});

1 Ответ

0 голосов
/ 12 апреля 2019

Вы можете попробовать это -

router.delete("/:title_url", checkAuth, async (req, res) => {
    const successMessage = "Successfully deleted blog post.";
    const errorMessage = "Error in deleting blog post.";
    try {
        let foundBlog = await Blog.findOne({ title_url: req.params.title_url });
        Comment.deleteMany({
            parentBlog: foundBlog._id
        });
        foundBlog.remove();
        console.log(foundBlog);
        res.status(200).json({ message: successMessage });
    } catch (error) {
        res.status(500).json({ message: errorMessage })
    }
});

На самом деле вы не обрабатываете отказ от обещания. Я думаю, что таким образом код будет более понятным и более читабельным Надеюсь, что это поможет.

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