我正在做一个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中创建新评论是有效的(例如,我有一个ID为28的帖子,通过在“http://localhost:8000/api/comments/28”上发出帖子请求,创建了评论,并且确实与帖子相关),但是为了从该帖子中获取所有评论,我发出了一个具有相同URL的GET请求,我收到了错误404。
我做错了什么?
控制器看起来很好,但从我发现的,把“/:id”到处在我的路线是一个坏的做法,但事件时,我改变它为“/:PostId”,例如,它什么也不做。
1条答案
按热度按时间b1uwtaje1#
router.post
注册POST请求的处理程序。当您收到
/api/comments/28
的HTTP POST请求时,它将由comCtrl.createComment
处理。如果
comCtrl.createComment
随后调用next
(第三个参数)--尽管我假设它不会调用,因为您并不想编写中间件--那么它将沿着处理程序列表传递到下一个匹配项(comCtrl.getPostComments
)。当您收到
/api/comments/28
的HTTP GET请求时,您没有处理程序,因为您没有调用router.get()
,所以您收到一个404错误。(这应该是一个405错误,但我不同意将其归因于Express设计决策)。如果您想处理GET请求,那么您需要编写代码,说明在收到GET请求时要做什么。