回到项目,按下 command + P,搜索 post.service,打开这个这个文件。在这里可以找个地方去定义一个按 ID 调取内容的功能。
定义并导出一个异步函数,名字是 getPostById ,让这个函数接收一个 postId 参数,类型是 number, 然后在函数的内部,先准备一段查询。
声明一个 statement, 用 SELECT 选择 post 表里的 id,还有 post 表里的 title,再加上 post 表里的 content 栏目。接着再用几个查询片断,sqlFragment 里的 user,这个栏目的值是内容的作者,再加上 sqlFragment 里的 totalComments ,它的值是这个内容的评论总数。
还需要 sqlFragment 里的 file,这个栏目的值是内容相关的图像文件,还需要 sqlFragment 里的 tags,这的值是内容相关的一组标签。最后再加上 sqlFragment 里的 totalLikes。它的值是这个内容被赞的次数。
在 FROM 的后面设置数据来源,设置成 post 数据表。在查询里还得拼接几个数据表,用一下 sqlFragment 里的 leftJoinUser,拼接 user 还有 avatar 数据表,然后是 sqlFragment 里的 leftJoinOneFile,这个查询片断拼接的是文件数据表。还需要 sqlFragment 里的 leftJoinTag,它拼接的是 tag 数据表。
最后再用 WHERE 设置一个查询条件,条件是 post 数据表的 id 栏目应该等于一个特定的值。这里先用占位符来表示这个值。
下面再把准备好的这段查询交给数据仓库执行一下,const 方括号,data,等于 await,使用 connection ,先用 promise 方法,接着再调用 query 方法,要执行的查询就是上面定义的 statement ,查询里的占位符的值是 postId,也就是这个函数接收的这个 postId 参数。
然后可以处理一下没找到指定内容这种情况,判断一下 ! data 里的第一个项目的 id 属性,如果没找到内容这个属性的值会是 null, 如果没找到内容,我们就 throw 一个异常,新建一个 ERROR,错误信息是 NOT_FOUND。等会儿再去处理这个异常情况。
最后让这个函数提供点数据,return 的就是 data 里的第一个项目的值,也就是从数据仓库里查询出来的一个内容数据。
打开应用里的 app.middleware, 找到在这里定义的异常处理器,在里面添加一种新的错误情况,如果错误信息是 NOT_FOUND,这种情况我们就可以把响应的状态码设置成 404,响应的信息设置成 没找到 ~~