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
相关产品推荐
相关产品推荐

