11-blog-获取文章(内容、标签、作者信息)

233 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

前言:

该接口用于文章页面的数据展示,响应数据需要包含文章所有内容,标签所有信息,及作者信息。

正文:

上文在创建文章时我们同时生成了一个唯一标识slug,可以通过该slug获取到指定文章;所以使用请求方式get,同时在history中的match写params参数,用于存放slug。

router.get("/:slug",authMiddleware,getArticle)

传递slug后,通过req.params.slug获取,同时判断数据库中是否存在该文章。

        const slug = req.params.slug;
        //数据校验:判断是否存在
        let article = await Article.findByPk(slug)
        if(!article){
            throw new HttpException(401,"文章不存在","article not found")
        }

判断该文章存在之后,我们就可以大胆的获取文章内容了。

获取文章信息

先打印一下刚才通过slug寻找到的article文章长什么样子(其实就是数据库中原样子)

image.png

如上图,就是数据库中的样子。

获取标签

由于在最初建表的时候将文章与标签设置了多对多的关系,所以可以通过筛选带有slug的tag,进而获取新的文章数据。

 let article = await Article.findByPk(slug,{include:Tag}) //执行语句

再次打印article:

image.png

可以看到最后一行存在该文章下面的标签了!但数据过于冗余,因为还存在创建时间什么的,可以只将tag拿出来展示。步骤:

  1. 将该Tags数组遍历,得到每一个tag然后存进数组。并放进article中展示。
        const tags = []
        for(const tag of article.dataValues.Tags){
            tags.push(tag.name) // 依次放进数组中
        }
        article.dataValues.tags = tags //替换并展示

获取作者

在上节打印多对多的关系时可以发现__proto__自动增加了很多方法,其中有一条getUser()就是获取作者信息的方法。

指路:打印多对多中的方法在这里

 let  author = await article.getUser() //获取作者信息 直接使用隐藏方法
 article.dataValues.author=author //将作者信息追加到article中

数据响应

此时数据响应:

image.png

由于存在用户的隐私数据password,所以删掉这些。

  delete author.dataValues.password;
  delete article.dataValues.UserEmail

此时再打印,就是完美的数据啦。

文章内容、标签、作者信息与一体的响应数据。

image.png