如何在Swagger UI中隐藏Nest.js控制器方法的参数输入框?
解决方案
问题原因
你遇到的重复输入项是因为@nestjs/swagger会自动扫描控制器所有参数装饰器,@Headers('Authorization')会被识别为公开请求头参数生成输入框,和@ApiBearerAuth注册的全局安全方案重复。该参数默认必填,且输入值优先级低于锁按钮设置的全局授权值,所以会出现输入无效但要求必填的问题。
解决方法
方法1:直接标记参数忽略(最简便)
给Authorization头的参数添加@ApiIgnore()装饰器,让Swagger文档生成时忽略该参数,完全不影响Nest运行时的参数注入:
@ApiBearerAuth('MyAuth') @Get() async getEmployees( @ApiIgnore() // 仅作用于Swagger文档生成,不影响业务逻辑 @Headers('Authorization') auth: string, @Query() query: EmployeesQuery, ) { // 原有逻辑无需修改 }
方法2:封装自定义授权头装饰器(适合多接口复用)
如果项目中大量接口都需要注入Authorization头,可以把参数注入和忽略Swagger的逻辑封装为自定义装饰器,避免每个接口重复加装饰器:
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; import { ApiIgnore } from '@nestjs/swagger'; // 自定义授权头装饰器 export const AuthToken = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.headers.authorization; }, [ // 绑定Swagger忽略逻辑 (target, propertyKey, parameterIndex) => { ApiIgnore()(target, propertyKey, parameterIndex); }, ], );
控制器中直接使用即可:
@ApiBearerAuth('MyAuth') @Get() async getEmployees( @AuthToken() auth: string, // 替换原有@Headers装饰器 @Query() query: EmployeesQuery, ) { // 原有逻辑无需修改 }
修改后重启服务,Swagger UI就不会再显示多余的Authorization请求头输入框,仅保留锁图标授权按钮,原有授权功能完全不受影响。
内容的提问来源于stack exchange,提问作者d9k
相关产品推荐
相关产品推荐

