跳至主要內容

配置环境变量

刘春龙原创...大约 2 分钟NodejsNestjs教程文档

应用经常运行在不同的 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 { }



 


 
 
 




上次编辑于:
贡献者: 刘春龙
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7