dan*_*igi 3 node.js typescript nestjs
我正在尝试创建一个通用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是控制器:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在 Github 存储库上发现了这个问题: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) }
}
}
}
})
);
};
Run Code Online (Sandbox Code Playgroud)
这是如何将其应用于控制器的示例
@OpenApiPaginationResponse(DTOHere)
public async controllerMethod() {}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助你
| 归档时间: |
|
| 查看次数: |
5454 次 |
| 最近记录: |