环境配置与多环境管理
环境配置的基本概念
环境配置是Express应用开发中不可忽视的环节。开发、测试和生产环境的需求各不相同,比如数据库连接、API密钥和日志级别等。通过合理配置,可以确保代码在不同环境中无缝运行。
// 基础环境变量示例
const port = process.env.PORT || 3000;
const dbUrl = process.env.DB_URL || 'mongodb://localhost:27017/dev_db';
使用dotenv管理环境变量
dotenv包能将环境变量从.env文件加载到process.env中。首先安装它:
npm install dotenv
创建.env文件:
PORT=3000
DB_URL=mongodb://localhost:27017/prod_db
API_KEY=your_api_key_here
在应用中加载配置:
require('dotenv').config();
const express = require('express');
const app = express();
app.listen(process.env.PORT, () => {
console.log(`Server running on port ${process.env.PORT}`);
});
多环境配置策略
配置文件方式
创建config目录,按环境区分配置文件:
/config
├── default.js
├── development.js
├── test.js
└── production.js
default.js包含通用配置:
module.exports = {
logLevel: 'info',
timeout: 5000
};
development.js扩展默认配置:
const config = require('./default');
module.exports = Object.assign({}, config, {
dbUrl: 'mongodb://localhost:27017/dev_db',
debug: true
});
环境变量覆盖方式
通过NODE_ENV指定环境:
NODE_ENV=production node app.js
在代码中动态加载配置:
const env = process.env.NODE_ENV || 'development';
const config = require(`./config/${env}`);
app.set('dbUrl', config.dbUrl);
高级配置技巧
配置验证
使用joi验证环境变量:
const Joi = require('joi');
const schema = Joi.object({
PORT: Joi.number().required(),
DB_URL: Joi.string().uri().required()
});
const { error, value } = schema.validate(process.env);
if (error) {
throw new Error(`配置验证失败: ${error.message}`);
}
敏感信息处理
对于敏感信息,建议使用加密或密钥管理服务:
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');
const client = new SecretManagerServiceClient();
async function getSecret(secretName) {
const [version] = await client.accessSecretVersion({
name: secretName
});
return version.payload.data.toString();
}
环境特定中间件
根据环境加载不同中间件:
if (process.env.NODE_ENV === 'development') {
app.use(require('morgan')('dev'));
app.use(require('errorhandler')());
}
if (process.env.NODE_ENV === 'production') {
app.use(require('compression')());
app.use(require('helmet')());
}
测试环境特殊处理
测试环境可能需要模拟服务:
if (process.env.NODE_ENV === 'test') {
const { setupMockDatabase } = require('./test/mocks');
setupMockDatabase();
// 禁用日志避免干扰测试输出
app.set('logger', { info: () => {}, error: () => {} });
}
部署配置实践
Docker环境变量
在Docker中传递环境变量:
FROM node:14
ENV NODE_ENV=production
COPY . .
RUN npm install
CMD ["node", "app.js"]
启动容器时覆盖:
docker run -e "DB_URL=mongodb://prod-db:27017/app" my-app
Kubernetes配置
使用ConfigMap和Secret:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
NODE_ENV: "production"
LOG_LEVEL: "info"
配置热重载
开发环境下实现配置热更新:
const fs = require('fs');
const path = require('path');
let config = require('./config/development');
fs.watch(path.join(__dirname, 'config/development.js'), () => {
delete require.cache[require.resolve('./config/development')];
config = require('./config/development');
console.log('配置已重新加载');
});
跨团队协作配置
使用配置模板帮助新成员快速上手:
.env.example
内容示例:
# 应用配置
PORT=3000
# 数据库配置
DB_URL=mongodb://localhost:27017/dev_db
# 第三方API
API_KEY=your_api_key_here
配置版本控制
将敏感信息与配置分离,建议.gitignore:
# 忽略本地环境文件
.env
*.local.env
# 忽略敏感配置
config/local*.js
同时提交示例文件:
.env.example
config/example.js
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:项目结构与目录组织规范
下一篇:路由分层与模块化设计