dotenv
dotenv
将环境变量从 .env
文件加载到 process.env
中。
可以让我们在不同的环境中轻松管理应用的配置。
创建项目试一下:
bash
mkdir config-test
cd ./config-test
npm init -y
安装 dotenv:
bash
npm install dotenv
创建 .env 文件:
ini
DB_HOST=localhost
DB_USER=root
DB_PASS=123
index.js 引入加载:
typescript
require('dotenv').config({
path: './.env',
});
console.log(process.env);
如何区分开发环境和生产环境的配置呢?
比如 .production.env:
bash
DB_PASS=456
我们可以通过 NODE_ENVIRONMENT 环境变量来切换:
typescript
require('dotenv').config({
path: process.env.NODE_ENVIRONMENT === 'production' ? './.production.env' : './.env',
});
console.log('DB_PASS', process.env.DB_PASS);
可以使用 export 置顶环境变量:
js-yaml
如果要使用 yaml 格式的配置文件,安装 js-yaml 包:
bash
npm install js-yaml
创建 config.yaml
配置文件:
yaml
server:
port: 3000
database:
host: localhost
user: admin
password: secret
使用 Node.js 的 fs
模块来读取文件内容,js-yaml
库来加载和解析 YAML 文件:
javascript
const fs = require('fs');
const yaml = require('js-yaml');
try {
// 读取 YAML 配置文件
const fileContents = fs.readFileSync('./config.yaml', 'utf8');
// 解析 YAML 文件内容为 JavaScript 对象
const config = yaml.load(fileContents);
console.log(config);
} catch (e) {
console.error(e);
}
使用 js 对象的形式将 yaml 格式配置返回了。
yaml 的格式更适合有层次关系的配置,而 .env 更适合简单的配置。
也同样可以通过 NODE_ENVIRMENT
环境变量来切换生产、开发的配置文件。
Nest 使用 config
基本使用
安装 @nestjs/config
包,它提供了 ConfigModule
和 ConfigService
。
创建项目:
bash
nest new nest-config-test -p npm
安装 @nestjs/config
包:
bash
npm install @nestjs/config
根目录件创建 .env:
bash
DB_HOST=localhost
DB_USER=root
DB_PASS=123
在 AppModule 里面引入:
注入 ConfigService 读取配置:
Nest 服务跑起来:
typescript
npm run start:dev
成功读取配置。
多个配置文件
重复的配置项,前面会覆盖后面的配置。
自定义配置
可以创建一个配置文件(如 config.ts
),并在其中导出一个配置对象。然后在 ConfigModule
中使用这个文件。
typescript
export default async () => {
const dbPort = await 3306;
return {
port: parseInt(process.env.PORT, 10) || 3000,
db: {
host: 'localhost',
port: dbPort,
},
};
};
引入:
在 Controller 里取出来:
浏览器访问下:
这样,就可以动态加载配置了。
自定义配置解析 yaml
bash
npm install js-yaml
配置加载:
typescript
import { readFile } from 'fs/promises';
import * as yaml from 'js-yaml';
import { join } from 'path';
export default async () => {
const configFilePath = join(process.cwd(), 'example.yaml');
const config = await readFile(configFilePath);
return yaml.load(config);
};
AppModule 引入:
同名依旧是前面覆盖后面的。
forFeature
可以通过 ConfigModule.forFeautrue 来注册局部配置:
- 动态模块的 forRoot 用于在 AppModule 里注册,一般指定为全局模块
- forFeature 用于局部配置,在不同模块里 imports
- 而 register 用于一次性的配置