持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
这是该博客系统的最后一篇关于后台接口文章,至此共成功创建了21个接口,历时10天,每一篇都在掘金做了思维记录,成就感十足。
前言:
博客系统中后台接口的最后一个模块,那就是评论专区。可以在写评论发布,可以点击评论窗口,可以删除评论。
正文
发布评论
创建评论大致流程,首先要在一个博客下生成评论,所以在路由时要有blog/:slug,其中slug就是该文章的唯一标识,通过req.params.slug获取到slug,并通过slug查找到整篇文章。
router.post('/:slug',authMiddleware,addComment)
获取slug:
//获取文章slug
const slug = req.params.slug
获取slug就已经获取到文章啦,但是还需要验证该作者是否登录,如果只是一名游客的话,那是不允许评论文章的,对吧。
const {email} = req.user;
const user = await User.findByPk(email)
if(!user){
throw new HttpException(401,"请先登录","please login")
}
下一步:获取整篇文章:
let article = await Article.findByPk(slug);
if(!article){
throw new HttpException(401,"文章不存在","article not found")
}
已经拿到该文章了,下面就是将前端的评论传至后端插入数据库中了。
const {body} = req.body.comment //获取到评论
let newComment = await Comment.create({body}) //创建到数据库中
还需要考虑的一点是进行数据关联,因为这条评论是单纯被插入到数据库中的,所以要将它和作者,文章都产生关联,让这个评论隶属于文章与作者下。
//创建用户和评论的关系
await user.addComments(newComment)
// 创建文章和评论的关系
await article.addComments(newComment)
至此,创建成功。
响应数据:
return res.status(200).json({
status:1,
message:"创建评论成功",
data:newComment
})
查看所有评论:
查看所有评论,即查看该文章下的所有评论,一定是要通过sql语句查找有关联关系的comment了。
同上,也是要获取文章参数,知道是哪一篇文章下的评论,然后再去使用查找语句。
本身使用where就可以查找关联文章slug下的评论了。再次include只是为了让显示的信息被追加用户及其属性。
const comments = await Comment.findAll({
where:{
articalSlug:slug
},
include:[ //追加对象属性
{
model:User,
attributes:["username","avatar","bio"]
}
]
})
响应数据:
return res.status(200).json({
statu:1,
message:"获取评论成功",
data:comments
})
删除评论
该条被删除的评论应该是隶属于某篇文章下的,且一篇文章下还会有很多评论,所以应该有两个params参数。
router.delete("/:slug/:id",authMiddleware,deleteComment) //删除评论,根据文章id
每条评论生成时都会带参数id,根据id去判断应该删除的是哪条。
获取到这两个参数:
const {slug,id} = req.params;
并判断这两个参数是否存在,不存在就要抛出错误。
const article = await Article.findByPk(slug)
if(!article){
throw new HttpException(401,"文章不存在","article not found")
}
const comment = await Comment.findByPk(id)
if(!comment){
throw new HttpException(401,"评论不存在","comment not found")
}
这篇文章存在、这条评论存在,那可以进行删除操作了。
但是,所有人都可以随意删除评论吗?很显然不是的。在我的博客系统中,我准备设置 只有该评论的博主才可以删除他自己的这条评论。
也就是验证生成该评论时的email,与我当前登录的email是否相等,作为依据。
如果不相等的话,那它没有权利删别人的评论。
const userEmail = req.user.email;
const commentEmail = comment.UserEmail
if(userEmail!==commentEmail){
throw new HttpException(401,"当前用户没有删除权限","only author could delete comments")
}
删除这条评论:
await comment.destroy()
最后响应删除成功的数据:
return res.status(200).json({
status:1,
message:"删除评论成功"
})