You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node/Express帖子评论路由异常:获取评论报404错误

问题描述

我正在开发一个包含认证、帖子和评论功能的CRUD项目,在路由设计和帖子与评论关联实现上遇到问题:

当前路由配置(评论路由)

router.post("/:id", auth, comCtrl.createComment);
router.post("/:id", auth, comCtrl.getPostComments);
router.post("/:id", auth, comCtrl.deleteComment);

App.js 配置

app.use("/api", postRoutes);
app.use("/api/comments", comRoutes);

获取帖子评论的控制器代码

exports.getPostComments = async (req, res) => {
  const { PostId } = req.params.id;

  Comment.findAll({
    where: {
      PostId: PostId,
    },
    order: [["createdAt", "DESC"]],
    include: [
      {
        model: User,
        attributes: ["id", "firstName", "lastName", "imageUrl"],
      },
    ],
    order: [["createdAt", "ASC"]],
  })
    .then((comment) => {
      res.status(200).send(comment);
    })
    .catch((err) =>
      res.status(500).send({
        err,
      })
    );
};

遇到的问题

Postman中发送POST请求到http://localhost:8000/api/comments/28可以成功创建关联到帖子28的评论,但发送GET请求到同一URL获取该帖子所有评论时,返回404错误。尝试将路由参数改为/:PostId也无效。


错误分析与解决方案

1. HTTP请求方法不匹配(核心问题)

当前所有评论路由都用了post方法,但获取资源的请求应该用GET方法。当你发送GET请求时,Express找不到对应的路由,直接返回404。

2. 路由重复定义

同一个路径+同一个HTTP方法的路由只会生效第一个,后面的router.post("/:id", ...)会被完全忽略,即使改参数名也没用。

3. 控制器参数获取错误

req.params.id是字符串值,const { PostId } = req.params.id;的解构方式完全错误,无法拿到正确的帖子ID。

4. 重复的排序配置

Comment.findAll里写了两次order,后面的配置会覆盖前面的,属于冗余代码。


修正后的代码

评论路由调整(遵循RESTful规范)

// 创建评论:POST + 帖子ID
router.post("/:postId", auth, comCtrl.createComment);
// 获取指定帖子的评论:GET + 帖子ID
router.get("/:postId", auth, comCtrl.getPostComments);
// 删除指定评论:DELETE + 评论ID(语义化设计,用评论自身ID而非帖子ID)
router.delete("/:commentId", auth, comCtrl.deleteComment);

控制器代码修正

exports.getPostComments = async (req, res) => {
  // 正确获取帖子ID:匹配路由里的:postId参数
  const postId = req.params.postId;

  try {
    const comments = await Comment.findAll({
      where: {
        PostId: postId,
      },
      include: [
        {
          model: User,
          attributes: ["id", "firstName", "lastName", "imageUrl"],
        },
      ],
      // 仅保留一个排序规则
      order: [["createdAt", "ASC"]],
    });
    res.status(200).send(comments);
  } catch (err) {
    res.status(500).send({ err });
  }
};

补充说明

  • RESTful规范:创建资源用POST,获取用GET,删除用DELETE,路由逻辑清晰,符合HTTP方法语义。
  • 路由语义化:删除评论用评论自身ID,避免和帖子ID混淆,更符合资源操作逻辑。
  • 异步代码优化:改用async/await替代then/catch,可读性更强。

内容的提问来源于stack exchange,提问作者Fenrir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:01:08