D14 去实现的内容列表的排序与分页功能。在用 TypeOrm 提供的方法查询出内容列表的时候,查询用的方法可以先去创建一个 QueryBuilder,然后用 take 方法设置一下每次返回的列表项目数量,用 skip 可以设置跳过的项目数量。
queryBuilder .take(limit) .skip(limit * (page - 1));
这种分页内容的方法需要两个变量,一个是每页显示的列表数量,还有一个是当前的页码。这两个变量可以动态得到值,比如它们可以来自地址查询符。在 Nest.js 应用里,可以创建一个自定义的参数装饰器,去获取到请求地址里的查询参数的值。
export const ListOptions = createParamDecorator((data: Partial<ListOptionsInterface> = {}, req) => { let { page, limit } = req.query; ... }
分页内容还有一个关键是得到总共的结果数量,使用 QueryBuilder 上的 getManyAndCount 这个方法可以返回查询结果还有结果数量。
queryBuilder.getManyAndCount()
用上面的这个方法返回的查询结果可以使用一个拦截器转换一下,可以把结果数量放在一个自定义的头部信息里,这样前端或移动端应用可以读取这个头部信息的值,去实现分页功能。
return next.handle() .pipe( map( data => { const [entities, total] = data; request.res.header('X-Total-Count', total); return entities; } ) );
排序
对结果按某种条件排序可以使用一下 orderBy 方法,设置排序的条件还有排序的方法(升序或降序)。
queryBuilder .orderBy({ [`post.${sort}`]: order });