如何在JavaScript中从Swagger隐藏JSON Schema枚举指定值?
可以实现,给你几种实用方案:
方案1:生成Swagger专用的Schema副本
不用改动业务逻辑用的原始Schema,单独复制一份并过滤掉tester,专门给Swagger用:
// 业务侧使用的原始Schema const originalSchema = { type: 'string', enum: ['apple', 'banana', 'grape', 'tester'] }; // 生成Swagger专用的过滤后Schema const swaggerSchema = { ...originalSchema, enum: originalSchema.enum.filter(item => item !== 'tester') };
这种方式简单直接,业务和文档用的Schema互不影响,不会干扰后端校验逻辑。
方案2:在Swagger文档生成阶段做过滤
如果用swagger-jsdoc这类自动生成工具,可以在文档生成后遍历Schema,批量过滤指定枚举值:
const swaggerJSDoc = require('swagger-jsdoc'); const options = { definition: { openapi: '3.0.0', info: { title: '你的API文档', version: '1.0.0' } }, apis: ['./routes/*.js'] // 你的API路由文件路径 }; // 生成原始Swagger文档 let swaggerDoc = swaggerJSDoc(options); // 遍历所有Schema,过滤掉枚举中的tester function filterInternalEnums(doc) { if (doc.components?.schemas) { Object.values(doc.components.schemas).forEach(schema => { if (schema.enum && Array.isArray(schema.enum)) { schema.enum = schema.enum.filter(val => val !== 'tester'); } }); } return doc; } // 应用过滤逻辑得到最终文档 swaggerDoc = filterInternalEnums(swaggerDoc);
方案3:用OpenAPI扩展标记+Swagger UI自定义渲染
给内部枚举值加自定义扩展标记,再通过Swagger UI的钩子隐藏对应项,适合需要保留Schema完整性但仅隐藏展示的场景:
首先修改Schema添加扩展字段:
const schema = { type: 'string', enum: ['apple', 'banana', 'grape', 'tester'], // 自定义扩展,标记内部枚举值 'x-internal-enums': ['tester'] };
然后在初始化Swagger UI时添加过滤逻辑:
const ui = SwaggerUIBundle({ url: '/swagger.json', dom_id: '#swagger-ui', onComplete: function() { // 先从文档中获取内部枚举列表 const internalEnums = ui.spec.components.schemas.YourSchemaName['x-internal-enums'] || []; // 隐藏所有属于内部枚举的选项 document.querySelectorAll('.parameter__enum li, .schema-enum li').forEach(li => { const val = li.textContent.trim(); if (internalEnums.includes(val)) { li.style.display = 'none'; } }); } });
内容的提问来源于stack exchange,提问作者user23444706
相关产品推荐
相关产品推荐

