如何在Node/Express API生产环境中禁用Swagger
当然可以!用npm脚本配合环境变量就能轻松实现开发环境启用Swagger、生产环境禁用的需求,下面给你几个实用的方案,都是日常开发里常用的:
方案一:通过环境变量直接控制Swagger加载
这是最直接的方式,核心思路是在Express入口文件里判断当前环境,只有开发环境才挂载Swagger路由。
1. 修改Express入口代码(比如app.js)
const express = require('express'); const app = express(); // 仅在开发环境加载Swagger if (process.env.NODE_ENV === 'development') { const swaggerUi = require('swagger-ui-express'); const swaggerDocument = require('./swagger.json'); // 你的Swagger定义文件路径 app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); } // 你的其他API路由逻辑 app.get('/api/users', (req, res) => { res.json({ data: [] }); }); app.listen(process.env.PORT || 3000, () => { console.log(`Server running in ${process.env.NODE_ENV} mode`); });
2. 配置npm脚本
在package.json里添加启动脚本,通过设置NODE_ENV环境变量区分环境:
{ "scripts": { "start": "NODE_ENV=production node app.js", "dev": "NODE_ENV=development nodemon app.js" } }
- 运行
npm run dev:开发环境启动,Swagger文档可通过/api-docs访问 - 运行
npm start:生产环境启动,Swagger路由不会挂载,外部无法访问
方案二:用独立配置文件分离环境设置
如果你的项目有很多环境专属配置,把Swagger开关放到单独的配置文件里会更清晰。
1. 创建环境配置文件
在项目根目录新建config文件夹,分别创建开发和生产配置:
config/dev.js
module.exports = { enableSwagger: true, // 其他开发环境配置:比如数据库地址、日志级别等 };
config/prod.js
module.exports = { enableSwagger: false, // 其他生产环境配置 };
2. 在入口文件加载对应配置
修改app.js:
// 根据环境变量加载对应配置 const env = process.env.NODE_ENV || 'development'; const config = require(`./config/${env}`); const express = require('express'); const app = express(); if (config.enableSwagger) { const swaggerUi = require('swagger-ui-express'); const swaggerDocument = require('./swagger.json'); app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); } // 后续路由逻辑...
跨平台兼容小技巧:使用cross-env
上面的脚本在Linux/macOS下没问题,但Windows系统的环境变量设置语法不一样。为了让脚本跨平台通用,推荐安装cross-env包:
- 安装依赖:
npm install cross-env --save-dev
- 修改npm脚本:
{ "scripts": { "start": "cross-env NODE_ENV=production node app.js", "dev": "cross-env NODE_ENV=development nodemon app.js" } }
这样不管是Windows还是类Unix系统,脚本都能正常运行。
额外注意事项
- 部署生产环境时,一定要确认
NODE_ENV确实被设置为production,避免误开启Swagger - 如果用Docker部署,可以在
Dockerfile里添加ENV NODE_ENV=production,或者启动容器时通过-e NODE_ENV=production传递环境变量 - 若你的Swagger文档是动态生成的(比如用
swagger-jsdoc),同样可以通过环境变量控制生成逻辑,避免生产环境生成不必要的文档内容
内容的提问来源于stack exchange,提问作者user198829438
相关产品推荐
相关产品推荐

