NestJS swagger 模块无法与通用 CRUD 控制器正常工作

2024-03-13

我正在尝试创建一个通用 CRUD 控制器,该控制器在 NestJS 应用程序中使用通用 CRUD 服务。它工作正常,但 swagger 模块无法正确生成有关 REST 服务参数的文档。

这是服务:

import { Model, Document } from "mongoose";

export abstract class CrudService<CrudModel extends Document, CreateDto, UpdateDto> {

    constructor(protected readonly model: Model<CrudModel>) {}

    async findAll(): Promise<CrudModel[]> {
        return this.model.find().exec();
    }

    async create(dto: CreateDto): Promise<CrudModel> {
        const createdDto = new this.model(dto);
        return createdDto.save();
    }

    async update(id: any, dto: UpdateDto): Promise<CrudModel> {
        return this.model.findOneAndUpdate({ _id: id }, dto, { new: true });
    }

    async delete(id: any): Promise<boolean> {
        const deleteResult = await this.model.deleteOne({ _id: id });
        return deleteResult.ok === 1 && deleteResult.deletedCount === 1;
    }

}

这是控制器:

import { Body, Delete, Get, Param, Post, Put } from "@nestjs/common";
import { Document } from "mongoose";
import { CrudService } from "./crud-service.abstract";

export abstract class CrudController<CrudModel extends Document, CreateDto, UpdateDto> {

    constructor(protected readonly service: CrudService<CrudModel, CreateDto, UpdateDto>) {}

    @Get()
    async findAll(): Promise<CrudModel[]> {
        return this.service.findAll();
    }

    @Post()
    async create(@Body() dto: CreateDto): Promise<CrudModel> {
        return this.service.create(dto);
    }
    
    @Put(':id')
    async update(@Param('id') id: string, @Body() dto: UpdateDto): Promise<CrudModel> {
        return this.service.update(id, dto);
    }

    @Delete(':id')
    async delete(@Param('id') id: string): Promise<boolean> {
        return this.service.delete(id);
    }

}

我在 Github 存储库上发现了这个问题:https://github.com/nestjs/swagger/issues/86 https://github.com/nestjs/swagger/issues/86

最后一条评论提到了使用 mixins 的解决方案,但我不知道如何使其适应我的需求


我最终开始描述我自己的模式。

这是自定义装饰器(NestJs 示例)

import { applyDecorators } from '@nestjs/common';
import { ApiOkResponse, getSchemaPath } from '@nestjs/swagger';

export const OpenApiPaginationResponse = (model: any) => {
  return applyDecorators(
    ApiOkResponse({
      schema: {
        properties: {
          totalPages: {
            type: 'number'
          },
          currentPage: {
            type: 'number'
          },
          itemsPerPage: {
            type: 'number'
          },
          data: {
            type: 'array',
            items: { $ref: getSchemaPath(model) }
          }
        }
      }
    })
  );
};

这是如何将其应用于控制器的示例

@OpenApiPaginationResponse(DTOHere)
public async controllerMethod() {}

希望这可以帮助你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NestJS swagger 模块无法与通用 CRUD 控制器正常工作 的相关文章

随机推荐