NestJS集成Swagger时如何为SwaggerModule配置requestInterceptor
NestJS 接入Swagger时配置requestInterceptor实现自定义请求头方案
找不到配置入口的本质原因
很多人翻遍NestJS Swagger的官方文档都找不到requestInterceptor的配置说明,不是这个配置不支持,而是官方文档只列了框架层面的常用自定义配置,没有把所有透传给swagger-ui的原生配置做全量罗列。
实际上SwaggerModule.setup方法的第四个入参(也就是你现在传的options2),会把内部嵌套的swaggerOptions字段下的所有配置,原封不动透传给前端运行的swagger-ui实例,requestInterceptor本身就是swagger-ui原生支持的配置字段,不需要额外装插件、改前端源码就能用。
可直接复用的实现代码
在你现有Swagger初始化逻辑的基础上,把requestInterceptor嵌套在swaggerOptions层级下即可,不需要改动其他现有逻辑:
import { DocumentBuilder, SwaggerModule, SwaggerCustomOptions } from '@nestjs/swagger'; // 原有文档构建逻辑完全保留 const config = new DocumentBuilder() .setTitle('项目接口文档') .setVersion('1.0') .build(); const document = SwaggerModule.createDocument(app, config); // 改造你的options2配置 const options2: SwaggerCustomOptions = { // 你原有的顶层配置全部保留,比如自定义页面样式、路径前缀、持久化授权开关等 swaggerOptions: { // 在这里配置requestInterceptor requestInterceptor: (req) => { // 为所有Try it out发起的请求注入自定义Origin头 req.headers.Origin = '你需要设置的自定义Origin值'; // 其他自定义请求修改逻辑都可以在这里写,比如统一加请求头、调整请求路径等 return req; }, // 其他swagger-ui原生配置可以和requestInterceptor同层级放 persistAuthorization: true, }, }; SwaggerModule.setup('docs', app, document, options2);
实操踩坑提醒
- 不要把
requestInterceptor直接挂在SwaggerCustomOptions的顶层:顶层字段是NestJS专门用来做Swagger挂载流程的自定义配置,不会透传给前端的swagger-ui,挂错层级会完全不生效 - 这个拦截器的触发时机覆盖所有Try it out功能的全流程:不管是实际向后端发的接口请求,还是页面自动生成的curl代码片段,都会经过这个拦截器的处理逻辑,完全匹配需要修改Origin头的需求
- 拦截器拿到的请求对象,是已经完成认证头注入处理后的实例,不需要重复处理token、API Key这类授权逻辑,直接修改请求头即可
- 配置完成后启动服务,打开
/docs页面随便找个接口点Try it out,通过后端日志或者抓包工具检查请求头的Origin值,就能确认配置是否生效
内容的提问来源于stack exchange,提问作者jaycohb
相关产品推荐
相关产品推荐

