部署在EKS上的NestJS应用Swagger加载失败问题求助
解决NestJS EKS部署下Swagger文档丢失前缀重定向404问题
问题根源
Swagger UI默认会基于当前请求的根路径生成重定向地址,但EKS Ingress添加的动态前缀(如testservice/v1)并没有被Swagger识别,导致重定向时丢失前缀,跳转到根路径的/docs从而返回404。加上前缀是动态变化且非环境变量,没法提前硬编码配置。
修复方案
1. 先修正代码语法错误
你的代码中SwaggerModule.createDocument存在未闭合的括号,先补全:
const document = SwaggerModule.createDocument(app, options, { ignoreGlobalPrefix: true });
2. 动态适配请求前缀(推荐方案)
通过请求的原始URL或Ingress传递的请求头,动态提取当前路径前缀,配置给Swagger UI,确保所有请求都带上正确前缀。
方式一:基于swagger-ui-express动态配置
替换原有的app.use("*/docs",swaggerUi.serve,swaggerUi.setup(document));为以下代码:
app.use("*/docs", (req: Request, res: Response, next: NextFunction) => { // 优先从Ingress传递的X-Forwarded-Prefix头获取前缀,没有则从URL提取 const basePath = (req.headers['x-forwarded-prefix'] as string) || req.originalUrl.replace(/\/docs$/, ''); swaggerUi.setup(document, { swaggerOptions: { // 设置Swagger的基础路径,确保接口请求带上前缀 basePath: basePath, // 禁用自动重定向,避免丢失前缀 redirectUrl: false }, customSiteTitle: 'Test API 文档' })(req, res, next); }, swaggerUi.serve);
方式二:基于NestJS官方SwaggerModule动态配置
如果你更倾向于用官方模块,可通过中间件动态设置Swagger路径:
const document = SwaggerModule.createDocument(app, options, { ignoreGlobalPrefix: true }); // 处理所有前缀下的/docs请求 app.use('*/docs', (req, res, next) => { const basePath = (req.headers['x-forwarded-prefix'] as string) || req.originalUrl.replace(/\/docs$/, ''); // 动态设置Swagger的访问路径 SwaggerModule.setup(`${basePath}/docs`, app, document, { swaggerOptions: { basePath: basePath } }); next(); });
3. 验证Ingress配置(关键)
确保EKS的Ingress配置中传递了X-Forwarded-Prefix头,让应用能准确获取前缀:
# 示例Ingress配置片段 annotations: nginx.ingress.kubernetes.io/proxy-set-header: "X-Forwarded-Prefix /testservice/v1"
不同Ingress控制器的配置语法可能略有差异,对应调整即可。
原理说明
通过动态提取请求的前缀并传递给Swagger UI的basePath配置,让Swagger所有的静态资源请求和接口调用都带上该前缀,避免重定向时丢失路径信息。同时禁用自动重定向可以直接加载文档页面,跳过可能出错的跳转逻辑。
内容的提问来源于stack exchange,提问作者salt-pepper
相关产品推荐
相关产品推荐

