0

我有几个端点允许分页并返回一个包含分页项的对象以及可能的最大页数。例如,如果我有 41 个文档并且每页返回 5 个文档,它看起来像:

{
  items: [...],
  maxPages: 9
}

我还制作了一个自定义装饰器,以便将 ApiOkResponse 和 ApiQuery 组合在一起,如下所示:

export function Pagination() {
  return applyDecorators(
      ApiQuery({ name: page, type: Number }),
      ApiOkResponse({description: 'items and metadata', type: PaginationObjectDTO})
    );
}

export class PaginationObjectDTO{
  @ApiProperty({isArray: true})
  items
  @ApiProperty({type: Number})
  maxPages
}

我想知道是否可以动态设置类型,@ApiProperty以便将相同的 DTO 与不同的对象类型重用,如下所示。我尝试在 DTO 中创建一个构造函数,但它会返回一个错误。是否有可能或者我应该为每个创建不同的 DTO?

   @Get('dogs/:page')
   @Pagination(Dog)
   async getDogs(page)

   @Get('cats/:page')
   @Pagination(Cat)
   async getCats(page)

这是迄今为止我最接近的:

export class PaginationObjectDTO{
  @ApiPropertyOptional({isArray: true })
  items;

  @ApiPropertyOptional({type: Number})
  maxPages

  constructor(type){
    Object.assign(this.items, {type: type})
  }
}

export function Pagination(type?) {
  let typeDef = new PaginationObjectDTO(type)
  return applyDecorators(
      ApiQuery({ type: Number, name: page}),
      ApiOkResponse({description: 'Documents and metadata', type:typeDef })
    );
}

但是将 typeDef 分配给 type 会出现“类型不可分配”错误

4

1 回答 1

1

你可以按照这个:例如:

decorator:  @ApiPagination(Cat) || @ApiPagination(Dog)

装饰器文件:

import { applyDecorators, Type } from '@nestjs/common';
import { ApiExtraModels, ApiOkResponse, getSchemaPath } from '@nestjs/swagger';
    export const ApiPagination = <TModel extends Type<any>>(model: TModel) => {
      return applyDecorators(
        ApiExtraModels(model),
        ApiOkResponse({
          description: '',
          content: {
            'application-json': {
              schema: {
                properties: {
                  items: {
                    type: 'array',
                    items: {
                      $ref: getSchemaPath(model),
                    },
                  },
                  pagination: {
                    type: 'object',
                    properties: {
                      count: { type: 'number' },
                      pageSize: { type: 'number' },
                      page: { type: 'number' },
                    },
                  },
                },
              },
            },
          },
        }),
      );
    };
于 2021-05-13T12:47:28.050 回答