# 配置管理

URL: https://caijiao.org/koa/project/config
Source: docs/koa/project/config.md
Description: 配置管理在 Koa 应用中非常重要，能够帮助集中管理项目中的所有配置项，使得开发、测试和部署过程更加高效和规范。

在 [Koa](/koa/) 应用中，配置管理能够帮助集中管理项目中的所有配置项，使得开发、测试和部署过程更加高效和规范。通过合理的配置管理，应用可以轻松地进行环境切换、调整参数和优化性能。

## 配置文件的结构

通常，我们将应用的配置分为多个部分，例如数据库配置、第三方 API 密钥、应用的全局设置等。以下是一个常见的配置管理目录结构：

```plaintext
config/
│
├── config.js              # 全局配置文件
├── env.js                 # 环境配置文件
└── db.js                  # 数据库配置
````

### `config.js`

这是应用的全局配置文件，通常存放一些通用的设置，如应用名称、端口号等。

```js
module.exports = {
  appName: 'Koa App',
  port: 3000,
  environment: process.env.NODE_ENV || 'development'
};
```

### `env.js`

此文件根据不同的环境（如开发环境、测试环境、生产环境）提供不同的配置。通过使用环境变量来动态加载配置，可以避免将敏感信息硬编码到代码中。

```js
module.exports = {
  development: {
    dbHost: 'localhost',
    dbPort: 27017,
    dbName: 'koa_dev'
  },
  production: {
    dbHost: 'prod-db-server',
    dbPort: 27017,
    dbName: 'koa_prod'
  }
};
```

### `db.js`

用于处理数据库相关的配置，通常会包含数据库连接的相关信息。

```js
const env = require('./env');
const config = require('./config');

module.exports = {
  connect: () => {
    const dbConfig = env[config.environment];
    // 假设使用 mongoose 连接数据库
    const mongoose = require('mongoose');
    mongoose.connect(`mongodb://${dbConfig.dbHost}:${dbConfig.dbPort}/${dbConfig.dbName}`)
      .then(() => console.log('Connected to database'))
      .catch(err => console.error('Database connection error:', err));
  }
};
```

## 加载配置

可以在 `app.js` 中加载配置文件，并根据当前环境动态地选择合适的配置。例如：

```js
const Koa = require('koa');
const config = require('./config/config');
const db = require('./config/db');
const app = new Koa();

// 加载数据库配置
db.connect();

// 设置应用监听的端口
app.listen(config.port, () => {
  console.log(`${config.appName} is running on port ${config.port}`);
});
```

## 使用环境变量

为了安全起见，敏感信息（如 API 密钥、数据库密码等）应该存储在环境变量中，而不是直接写入配置文件中。你可以使用 `.env` 文件来存储这些信息，并使用 `dotenv` 库加载它们。

1. 安装 `dotenv`：

   ```bash
   npm install dotenv
   ```

2. 创建 `.env` 文件：

   ```plaintext
   DB_HOST=localhost
   DB_PORT=27017
   DB_NAME=koa_app
   ```

3. 在应用中加载环境变量：

   ```js
   require('dotenv').config();

   module.exports = {
     dbHost: process.env.DB_HOST,
     dbPort: process.env.DB_PORT,
     dbName: process.env.DB_NAME
   };
   ```

## 配置管理的最佳实践

1. **分环境管理**：不同的环境（如开发、测试、生产）需要不同的配置。确保每个环境有独立的配置文件，并根据环境变量动态加载。

2. **使用环境变量**：将敏感信息（如数据库密码、API 密钥）存储在环境变量中，而不是直接硬编码在配置文件里。

3. **集中管理**：尽量将所有配置项集中在配置文件中，避免分散在代码的各个部分。

4. **优先级管理**：配置文件中的设置应有优先级，确保开发环境、生产环境、测试环境的配置按需覆盖。

通过合理的配置管理，开发人员可以更方便地进行部署和切换不同环境中的设置，并且在开发过程中不会暴露敏感信息。
