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
相关产品推荐
相关产品推荐

