配置环境变量
应用经常运行在不同的 environments。 根据环境,应使用不同的配置设置。 例如,通常本地环境依赖于特定的数据库凭证,仅对本地数据库实例有效。 生产环境将使用一组单独的数据库凭据。 由于配置变量发生变化,最佳做法是在环境中使用 存储配置变量。
外部定义的环境变量通过 process.env 全局变量在 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')
}
}至此,本章节的学习就到此结束了,如有疑惑,可对接技术客服进行相关咨询。