NestJS 请求缓冲
一个简单的 NestJS 截取器 抓取查询参数并格式化为 Link Header, 基于 GitHub 图像 (原始内容存档于2017-10-21). pagination API. 此模块使用 格式-链接-标题 节点模块来构建响应链接头.
安装
npm install --save @algoan/nestjs-pagination
所需资源
- 在此版本上,附有此截取器的API需要返回一个对象:
{
"totalResources": 1530,
"resources": [ { ... }, ..., { ... }]
}
- 资源必须在截取器构造器中指定
限制
- 此模块不考虑返回的
resources属性。 可能与截取器所设置的头部不一致.
快速启动
导入 LinkHeaderInterceptor 在控制器方法旁边.
import { LinkHeaderInterceptor } from '@algoan/nestjs-pagination';
import { Controller, Get, UseInterceptors } from '@nestjs/common';
@Controller()
/**
* Controller returning a lot of documents
*/
class AppController {
/**
* Find all documents
*/
@UseInterceptors(new LinkHeaderInterceptor({ resource: 'data' }))
@Get('/data')
public async findAll(): Promise<{ totalResources: number; resources: DataToReturn[] }> {
const data: DataToReturn = await model.find(...);
const count: number = await model.count();
return { totalResources: count, resources: data };
}
}
例如,如果你有1015个资源 GET /data?page=4&per_page=100 将返回 :
Content-Range: data 300-399/1015
Link: </data?page=1&per_page=100>; rel="first", </data?page=11&per_page=100>; rel="last", </data?page=5&per_page=100>; rel="next", </data?page=3&per_page=100>; rel="prev"
如果您使用MongoDB作为数据库,我们也提供 ParamDecorator 您可以将请求转换为mongo查询参数.
import { LinkHeaderInterceptor, MongoPaginationParamDecorator, MongoPagination, Pageable } from '@algoan/nestjs-pagination';
import { Controller, Get, UseInterceptors } from '@nestjs/common';
@Controller()
/**
* Controller returning a lot of documents
*/
class AppController {
/**
* Find all documents
*/
@UseInterceptors(new LinkHeaderInterceptor({ resource: 'data' }))
@Get('/data')
public async findAll(@MongoPaginationParamDecorator() pagination: MongoPagination ): Promise<Pageable<DataToReturn>> {
const data: DataToReturn[] = await model.find(pagination);
const count: number = await model.count(pagination.filter);
return { totalResources: count, resources: data };
}
}
使用量
默认情况下, 截取器和装饰器会查找查询参数 page 财务报告和审定财务报表 per_page (默认为100).
您也可以通过传递配置对象来更改这些参数的名称和每页限制的默认值。 注意如果同时使用截取器和装饰器,需要将配置传递给两人.
new LinkHeaderInterceptor({ resource: 'data', pageName: '_page', perPageName: 'numberPerPage', defaultLimit: 50 })
@MongoPaginationParamDecorator({ pageName: '_page', perPageName: 'numberPerPage', defaultLimit: 50 })
也可以通过使用"PaginationBodyInterceptor"在反应体内得到帕吉能. 通过使用这个截取器,将帕吉能被收录在响应正文中,而不是取出头.
返回已分解的数据响应.
{
"resources": [],
"pagination": {
"next": null,
"previous": null,
"first": null,
"last": null,
"totalPages": 1,
"totalResources": 0,
}
}
导入 PaginationBodyInterceptor 在控制器方法旁边.
import { PaginationBodyInterceptor } from '@algoan/nestjs-pagination';
import { Controller, Get, UseInterceptors } from '@nestjs/common';
@Controller()
/**
* Controller returning a lot of documents
*/
class AppController {
/**
* Find all documents
*/
@UseInterceptors(new PaginationBodyInterceptor({pageName: 'page', perPageName: 'limit'}))
@Get('/data')
public async findAll(@MongoPaginationParamDecorator({pageName: 'page', perPageName: 'limit'}) pagination: MongoPagination): Promise<{ totalResources: number; resources: DataToReturn[] }> {
const data: DataToReturn = await model.find(...);
const count: number = await model.count();
return { totalResources: count, resources: data };
}
}