在客户端应用里,想要实现内容分页功能,比如显示可用的页码,除了要知道每页的内容数量以外,至少还得知道总共的内容数量,根据这些数据,客户端可以计算出它要展示的内容一共有多少页。下面我们要在服务端创建一个统计内容数量的功能,把统计的结果放在响应的头部数据里面,这样客户端应用就可以实现分页功能了。
打开 post.service,在这个文件里可以找个地方定义一下统计内容数量的功能,定义并导出一个异步函数,名字是 getPostsTotalCount 。
函数接收一个 options 参数,类型可以设置成 GetPostsOptions。 在函数的主体里面先解构一下函数的选项参数,需要的是 filter 这个属性。
下面可以准备一下 SQL 参数, 声明一个 params ,它的值是个数组,然后把 filter 里的 param 放到这个数组里面。这个 params 的值就是在执行查询的时候,要给查询里的占位符提供的值。
准备一段要执行的查询,声明一个 statement ,用一个字符模板,组织一段查询,用 SELECT ,然后用 COUNT ,统计一下 post.id ,起个名字叫 total 。
FROM,来自 post 数据表,下面还得再加上几个拼接数据表用的查询语句,这些语句是在 sqlfragment 里面定义的,先添加一个 leftJoinUser ,再添加一个 sqlFragment 里的 leftJoinOneFile ,下面还得再添加一个 sqlFragment 里的 leftJoinTag 。
再用 WHERE 设置一个条件,条件就是 filter 里的 sql 。
准备好查询以后可以去执行一下这段查询,解构查询回来的结果,把第一个项目交给 data,等于 await ,用一下 conneciton,先调用一下 promise,接着再用 query 方法执行查询,要执行的查询是 statement ,需要的参数在 params 里面。
最后让这个函数提供查询的结果, return 的就是 data 里的第一个项目里面的 total 这个属性的值。 这个 total 就是这段查询里面选择的这个栏目,它的值就是统计的内容数量。
打开 post.controller,在文件的顶部,先从 post.service 里面,把 getPostsTotalCount 导入进来。
然后在内容列表接口处理器里面,可以用一下这个功能,先用一组 try,catch ,在 catch 里面执行一下 next ,带着 error,这样如果在 try 里面做的事情发生了异常情况,就会交给应用默认的异常处理器去处理。
在 try 里面,先统计一下内容数量,声明一个 totalCount,等于 await, 执行 getPostsTotalCount,提供一个选项参数,里面需要一个 filter,对应的值设置成 request.filter
知道了内容的数量以后,可以把它放在响应的头部里面, 用 response 上的 header 方法在响应里添加一个头部数据,名字是 X-Total-Count,对应的值就是上面执行了 getPostsTotalCount 得到的结果,也就是这个 totalCount。
下面在 HTTP 客户端可以测试一下这个功能,打开 内容列表 请求,发送一下这个请求,然后打开 Header 这个选项卡,观察一下响应里的头部数据,你会发现,这里会出现一个 X-Total-Count ,它的值就是内容的数量,一页会有两个内容项目,一共有 4 个要显示的内容。
修改一下请求地址,在里面添加一个 tag 查询符,值设置成 秋天,发送一下这个请求。 这次在响应的头部里面,X-Total-Count 它的值会是 2 。 因为这次在请求里用标签名过滤了一下内容列表,被贴上 秋天 这个标签的内容一共找到了两个。