13-blog-后台创建评论、查看评论、删除评论

412 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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:"删除评论成功"
        })