配置环境变量
原创...大约 2 分钟
应用经常运行在不同的 environments
。 根据环境,应使用不同的配置设置。 例如,通常本地环境依赖于特定的数据库凭证,仅对本地数据库实例有效。 生产环境将使用一组单独的数据库凭据。 由于配置变量发生变化,最佳做法是在环境中使用 存储配置变量。
外部定义的环境变量通过 p
全局变量在 Node.js
内部是可见的。 我们可以尝试通过在每个环境中单独设置环境变量来解决多个环境的问题。 这很快就会变得笨拙,尤其是在需要轻松模拟和/或更改这些值的开发和测试环境中。
在 Node.js
应用中,通常使用 .env
文件,保存键值对,其中每个键代表一个特定值,以表示每个环境。 在不同的环境中运行应用只是交换正确的 .env
文件的问题。
在 Nest 中使用此技术的一个好方法是创建一个 ConfigModule
,它公开一个 ConfigService
,它加载适当的 .env
文件。 虽然你可以选择自己编写这样的模块,但为了方便起见,Nest 提供了开箱即用的 @nestjs/config
包。
npm i @nestjs/config --save
在根目录下新建.env
文件
PORT=3000
在app.module.ts中引入
import { Module } from '@nestjs/common';
import { UserModule } from './views/user/user.module';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true, }),
UserModule
],
})
export class AppModule { }
使用:
await app.listen(process.env.PORT);
改用 YAML 文件(替换.env文件)
要读取和解析 YAML 文件,我们可以利用 js-yaml 包。
npm i js-yaml
npm i -D @types/js-yaml
在根目录下创建 config.yaml
文件
http:
host: 'localhost'
port: 8080
db:
postgres:
url: 'localhost'
port: 5432
database: 'yaml-db'
sqlite:
database: 'sqlite.db'
在src/config
目录下创建env.ts
文件
import { readFileSync } from 'fs';
import * as yaml from 'js-yaml';
import { join } from 'path';
import { ConfigModule } from '@nestjs/config';
const configuration = () => {
return yaml.load(
readFileSync(join(__dirname, YAML_CONFIG_FILENAME), 'utf8'),
) as Record<string, any>;
};
const YAML_CONFIG_FILENAME = '../../config.yaml';
const Env = ConfigModule.forRoot({
isGlobal: true,
load: [configuration],
})
export {
Env
}
修改nest-cli.json
文件
提示
在构建过程中,Nest CLI 不会自动将你的 "assets"(非 TS 文件)移动到 dist 文件夹。 为了确保你的 YAML 文件被复制,你必须在 nest-cli.json
文件的 compilerOptions#assets
对象中指定它。
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true,
"assets": [
{
"include": "../config/*.yaml",
"outDir": "./dist/config"
}
]
}
}
使用
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { Env } from 'src/config/env';
@Module({
imports: [
Env,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule { }
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class AppService {
constructor(private configService: ConfigService) { }
getHello(): string {
return 'Hello World!';
}
getHi(): string {
return this.configService.get<string>('http.port');
}
}
Powered by Waline v2.15.7