【问题标题】:Deleting comments of a certain blog post删除某篇博文的评论
【发布时间】:2019-09-02 14:06:01
【问题描述】:

我正在尝试删除某个博客文章中的所有 cmets,该博客文章即将被 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 }));
});

【问题讨论】:

  • 我解决了。我忘了在 catch 块中执行一个函数。它应该说:catch(() => res.status(500).json({ message: errorMessage }))

标签: node.js angular mongodb express mongoose


【解决方案1】:

你可以试试——

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 })
    }
});

实际上,您并没有处理承诺拒绝。 我认为这样代码更清晰可读 希望对您有所帮助。

【讨论】:

  • 嘿谢谢您的回复。你的意思是即使在我发表评论后我也不处理它​​?您的代码与我的代码有何不同?对我来说,它看起来只是另一种语法。另外,“await”关键字不是仅在异步函数中可用吗?为什么它会在您的解决方案中起作用/代码的哪一部分使它成为异步函数?
  • 嘿,这是相同的代码,但有一点不同 - 在我的代码中,我处理从两个函数 findOne 和 deleteMany 捕获的错误(您只处理 find 函数的错误)。此外,我更喜欢在服务器启动时初始化所有 api,并为每个 api 使用异步函数
  • 好吧,你忘记了让我很困惑的“async”关键字。不过没问题,我很快就明白了。我编辑我的帖子并分享我想出的最终解决方案。进一步的改进(我如何缩短代码、最佳实践、更好的性能)仍然值得欢迎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
相关资源
最近更新 更多