我正在做一个Crud项目(包括auth、posts和comments(,我在理解如何有效地进行路由并将posts与comments链接时遇到了一些困难。
这是我的评论路线:
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",评论是创建的,并且确实与Post相关(,但是使用相同的URL发出GET请求以便从该Post中获取所有评论,我得到了错误404。
我做错了什么?
控制器看起来不错,但根据我的发现,将"/:id";在我的路线上到处都是一种糟糕的做法,但当我将其更改为"/:PostId";例如,它什么都不做。
router.post("/:id", auth, comCtrl.createComment); router.post("/:id", auth, comCtrl.getPostComments); router.post("/:id", auth, comCtrl.deleteComment);
router.post
为POST请求注册一个处理程序。
当您收到/api/comments/28
的HTTPPOST请求时,它将由comCtrl.createComment
处理。
如果comCtrl.createComment
随后调用next
(第三个参数(——尽管我假设它不会,因为您没有尝试编写中间件——那么它将沿着处理程序列表传递给下一个匹配(comCtrl.getPostComments
(。
当您收到/api/comments/28
的HTTP get请求时,由于没有调用router.get()
,因此没有处理程序,因此会收到404错误。(这应该是一个405的错误,但我不同意Express的设计决定(。
如果您想处理GET请求,那么您需要编写代码,说明收到GET请求时要做什么。