如何在NestJS Swagger OpenAPI CLI插件中排除特定属性?
解决方案
方法1:使用官方@ApiHideProperty()装饰器
这是最直接的官方方案——给需要排除的属性添加@ApiHideProperty()装饰器,NestJS Swagger CLI插件会自动识别并跳过该属性的@ApiProperty()生成,同时该属性会从Swagger文档中隐藏。
示例代码:
import { Entity, Column } from 'typeorm'; import { ApiHideProperty } from '@nestjs/swagger'; @Entity() export class User { @Column() id: number; // 自动生成@ApiProperty() @Column() username: string; // 自动生成@ApiProperty() @Column() @ApiHideProperty() // 跳过此属性的自动生成 password: string; }
方法2:自定义插件转换逻辑(批量排除场景)
如果需要批量排除符合特定规则的属性(比如所有以_开头的属性),可以自定义Swagger CLI插件的转换逻辑:
- 创建自定义Transformer文件(如
swagger-transformer.ts):
import { Type } from '@nestjs/common'; import { SwaggerGeneratorOptions } from '@nestjs/swagger/dist/swagger-generator.interface'; import { SwaggerTransformer } from '@nestjs/swagger/dist/swagger-transformer'; export class CustomSwaggerTransformer extends SwaggerTransformer { transformProperty( propertyKey: string, metadata: any, type: Type<any>, options: SwaggerGeneratorOptions, ) { // 这里定义排除规则:跳过所有以"_"开头的属性 if (propertyKey.startsWith('_')) { return null; } return super.transformProperty(propertyKey, metadata, type, options); } }
- 在
nest-cli.json中配置使用该Transformer:
{ "compilerOptions": { "plugins": [ { "name": "@nestjs/swagger", "options": { "classValidatorShim": true, "introspectComments": true, "transformer": "./swagger-transformer.ts" } } ] } }
注意事项
@ApiHideProperty()会同时阻止装饰器生成和文档展示,若仅需跳过自动生成但保留文档显示,可手动给该属性添加@ApiProperty()覆盖,但这样会失去自动生成的便捷性。- 自定义Transformer需确保与当前
@nestjs/swagger版本兼容,避免版本差异导致的API不匹配。
内容的提问来源于stack exchange,提问作者Gabriel Richards
相关产品推荐
相关产品推荐

