如何在NestJS中隐藏Swagger文档页的特定Schema/模型?
在NestJS Swagger中隐藏指定Schema的解决方案
下面是几种精准隐藏部分Schema的可行方案,无需修改文件名或类名:
1. 使用官方装饰器单独排除Schema
给需要隐藏的DTO类添加@ApiExcludeSchema()装饰器,Swagger会自动跳过该Schema的展示:
import { ApiExcludeSchema } from '@nestjs/swagger'; @ApiExcludeSchema() export class HiddenDto { id: number; description: string; }
这个方法最直接,适合只隐藏少量独立的Schema。
2. 避免引用关联的Schema(保留字段结构)
如果某个DTO被其他公开DTO引用,你想隐藏被引用的Schema但保留字段的结构描述,可以手动定义字段类型为object并指定属性,替代直接引用类:
import { ApiProperty } from '@nestjs/swagger'; export class PublicDto { @ApiProperty({ type: 'object', properties: { id: { type: 'number', description: 'ID' }, description: { type: 'string', description: '描述' } } }) relatedData: HiddenDto; }
这样PublicDto的字段会正常展示结构,但HiddenDto的Schema不会出现在Swagger的Schemas列表中。
3. 全局配置过滤指定Schema
在生成Swagger文档时,通过extraModels指定仅包含需要展示的Schema,或者用transformSchema自定义过滤逻辑:
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { PublicDtoA, PublicDtoB } from './your-dto-path'; const config = new DocumentBuilder() .setTitle('你的API文档') .setVersion('1.0') .build(); const document = SwaggerModule.createDocument(app, config, { // 仅传入需要展示的Schema extraModels: [PublicDtoA, PublicDtoB], // 自定义过滤:移除标题包含指定关键词的Schema transformSchema: (schema) => { if (schema.title?.includes('Hidden')) { return null; } return schema; } }); SwaggerModule.setup('api-docs', app, document);
transformSchema会遍历所有生成的Schema,返回null的Schema会被排除出文档。
内容的提问来源于stack exchange,提问作者Suhail Akhtar
相关产品推荐
相关产品推荐

