持续创作,加速成长!这是我参与「掘金日新计划 · 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文章长什么样子(其实就是数据库中原样子)
如上图,就是数据库中的样子。
获取标签
由于在最初建表的时候将文章与标签设置了多对多的关系,所以可以通过筛选带有slug的tag,进而获取新的文章数据。
let article = await Article.findByPk(slug,{include:Tag}) //执行语句
再次打印article:
可以看到最后一行存在该文章下面的标签了!但数据过于冗余,因为还存在创建时间什么的,可以只将tag拿出来展示。步骤:
- 将该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中
数据响应
此时数据响应:
由于存在用户的隐私数据password,所以删掉这些。
delete author.dataValues.password;
delete article.dataValues.UserEmail
此时再打印,就是完美的数据啦。
集文章内容、标签、作者信息与一体的响应数据。