You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js集成Swagger时遭遇406错误,请求排查指导

问题分析与修复方案

核心问题1:CORS验证错误错误返回406状态码

你的CORS配置中,当请求来源不在授权列表时,调用了notAcceptable('Domain not allowed by CORS'),这个函数会直接返回406 Not Acceptable错误,但CORS验证失败的正确处理应该是返回403或让CORS中间件自动处理错误响应,而非406。这是触发你看到的406错误的主要原因之一。

修复CORS错误处理

修改CORS的origin回调逻辑:

private options: Record<string, unknown> = {
  cors: {
    origin: (origin: string, callback: (error: Error | null, status?: boolean) => void) => {
      console.log(origin);
      // 兼容本地开发时origin为undefined的情况
      if (!origin || AUTHORIZED.indexOf(origin) !== -1) {
        callback(null, true);
      } else {
        // 使用普通错误对象,让CORS中间件正确处理响应
        callback(new Error('Domain not allowed by CORS'), false);
      }
    },
    methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
    allowedHeaders: ['Accept', 'Content-Type', 'Authorization', 'Origin', 'From'],
    credentials: true,
  },
};

核心问题2:Swagger UI请求的响应格式不匹配

Swagger UI页面加载时会发送Accept: text/html的请求,若你的服务器有全局中间件强制要求响应Content-Type为application/json,会导致服务器无法返回HTML格式,触发406错误。

修复Swagger UI的响应格式处理

确保Swagger UI的路由不受全局格式强制中间件影响,或者调整你注释掉的中间件逻辑:

if(excludeSwagger){
  // 为Swagger UI请求设置正确的Accept头处理
  this.application.use('/api-docs', (req, res, next) => {
    // 允许Swagger UI接受HTML和JSON格式
    req.headers['Accept'] = req.headers['Accept'] || 'text/html, application/json';
    next();
  });
  this.application.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
}

额外排查步骤

  • 检查中间件顺序:确保CORS中间件在所有路由(包括Swagger)之前注册,否则/api-docs请求不会经过CORS处理。
  • 临时禁用全局安全验证:暂时注释掉Swagger定义中的security: [{ JWTAuth: [] }],排除认证逻辑对格式响应的间接干扰。
  • 验证AUTHORIZED列表:确认控制台打印的origin值确实在AUTHORIZED数组中,避免因来源未授权触发错误。

内容的提问来源于stack exchange,提问作者Saurav Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:14:51