如何在HapiJS生产服务器中禁用Swagger API文档
嘿,这个场景我太熟悉了——很多团队开发时依赖Swagger UI调试,上线又怕暴露文档,给你几个稳妥的方案,都不会影响API的正常运行:
方案1:通过环境变量动态开关Swagger UI
这是生产环境最常用的方式,能让你在开发时正常用UI,部署生产时一键关闭,完全不影响API逻辑。
第一步,先读取环境变量判断当前环境:
const isProduction = process.env.NODE_ENV === 'production';然后在注册Swagger插件时,根据这个变量控制UI的启用状态:
await server.register({ plugin: require('hapi-swagger'), options: { // 核心:生产环境禁用Swagger UI界面 swaggerUI: !isProduction, // 可选:如果连JSON格式的文档也不想暴露,把路由前缀设为false routePrefix: isProduction ? false : '/docs', // 你的其他Swagger配置(比如API信息、标签等) info: { title: '我的API文档', version: '1.0.0' } } });划重点:
swaggerUI: false只会关闭可视化的UI界面,Swagger插件不会干预你的API路由,所以接口功能完全不受影响。
方案2:用路由权限做细粒度控制
如果需要更灵活的限制(比如只允许内部IP访问文档),可以先正常注册插件,再给Swagger路由加拦截:
// 先正常注册Swagger插件 await server.register({ plugin: require('hapi-swagger'), options: { routePrefix: '/docs', swaggerUI: true, // 其他配置... } }); // 生产环境下给Swagger路由加访问限制 if (process.env.NODE_ENV === 'production') { // 找到所有Swagger相关的路由 const swaggerRoutes = server.table().filter(route => route.path.startsWith('/docs')); swaggerRoutes.forEach(route => { // 方式1:直接拒绝所有外部访问 route.route.config.auth = 'deny'; // 方式2:IP白名单(适合内部人员偶尔需要查看文档的场景) // route.route.config.handler = (request, h) => { // const allowedIPs = ['192.168.1.100', '你的内部办公IP']; // if (!allowedIPs.includes(request.info.remoteAddress)) { // return h.response('Forbidden').code(403); // } // return h.continue; // }; }); }
方案3:生产环境直接不注册Swagger插件
如果确定生产环境完全不需要Swagger的任何功能(包括JSON文档),可以直接跳过插件注册:
// 只有非生产环境才注册Swagger if (process.env.NODE_ENV !== 'production') { await server.register({ plugin: require('hapi-swagger'), options: { // 开发环境的Swagger配置... } }); }
这个方案最彻底,生产环境不会加载Swagger插件,完全没有额外性能开销,也绝对不会暴露文档。
最后提醒
不管用哪种方案,一定要确保生产环境的NODE_ENV环境变量设置为production,不然配置不会生效哦!
内容的提问来源于stack exchange,提问作者Jitendra
相关产品推荐
相关产品推荐

