NestJS配置环境变量、读取Yaml配置的保姆级教程

前言

哈喽,大家好,我是 webxue ,也可以叫我 前端小帅 ,今天来分享一个nestjs学习中绕不过的东西,环境变量与配置 ,用过env配置,最终还是选择了 yaml

这里我先声明一下

  • 本地运行命令使用的 nest start --watch
  • 线上部署命令使用的 pm2 start dist/main.js --name nest-demo

编写环境变量

在项目根目录下新建了一个 yaml 的目录,里面存放 yaml 配置文件,我的 yaml 配置文件格式如下:

bash 复制代码
# [环境]-[用户].yaml
dev-zhangsan.yaml # 张三开发时使用的配置文件
dev-lisi.yaml # 李四开发时使用的配置文件
dev-wangwu.yaml # 王五开发时使用的配置文件
pro-120.yaml # 部署在120服务器上时使用的配置文件
pro-130.yaml # 部署在130服务器上时使用的配置文件

这里以 张三开发环境配置 为例,其他配置同理

yaml 复制代码
# dev-zhangsan.yaml
# 以下为示例,随便写一些配置,能读到就行
ENV_NAME: 开发环境-zhangsan
PORT: 3000
MYSQL:
  CONFIG:
    HOST: 127.0.0.1

安装依赖

执行 npm i @nestjs/config cross-env yaml 来安装依赖

  • @nestjs/config: 用来很方便的读取配置文件
  • cross-env: 用来设置当前环境
  • yaml: 用来解析yaml配置

修改启动脚本

json5 复制代码
// package.json
{
    // ...
    "scripts":{
        // ...
        "start:dev-zhangsan": "cross-env NODE_ENV=dev-zhangsan nest start --watch",
        "start:dev-lisi": "cross-env NODE_ENV=dev-lisi nest start --watch",
        "pm2:start:pro-120": "cross-env NODE_ENV=pro-120 pm2 start dist/main.js --name nest-demo"
        // ...
    }
}

当然,如果你觉得我的脚本命令太长了,这个你可以随意,而且我这个也只是个示例,莫要照抄...

接下来就可以在工程中读取到环境变量了

app.module.ts注入配置文件

先来看一下我的目录结构

typescript 复制代码
// app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import * as yaml from 'yaml';
import * as path from 'path';
import * as fs from 'fs';

@Module({
  imports: [
    ConfigModule.forRoot({
      load: [
        () => {
          // 获取当前环境标识
          const env = process.env.NODE_ENV || 'development';
          // 获取yaml配置文件路径
          const configPath = path.join(__dirname, `../yaml/${env}.yaml`);
          // 校验yaml路径不存在抛错
          if (!fs.existsSync(configPath)) {
            throw new Error(`Configuration file not found: ${configPath}`);
          }
          // 将yaml配置解析
          return yaml.parse(fs.readFileSync(configPath, 'utf8'));
        },
      ],
      isGlobal: true,
    }),
  ],
})
export class AppModule {}

在main.ts读取环境配置

typescript 复制代码
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';
import { Logger } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // 配置文件
  const configService = app.get(ConfigService);
  Logger.verbose(`当前环境:${configService.get('ENV_NAME')}`);
  Logger.verbose(`当前环境端口:${configService.get('PORT')}`);
  Logger.verbose(`Mysql的Host:${configService.get('MYSQL.CONFIG.HOST')}`);

  await app.listen(configService.get('PORT'));
}
bootstrap();

接下来,启动之后,就可以在控制台打印出来环境配置了。

到这里我相信你已经完全会了,如果你还不会在其他ts文件中读取config,在下面评论吧,多的话,我再出一篇文章,我相信应该不会有评论的~~~

结余

每天进步亿点点,主业前端,副业后端,做过自媒体,但没坚持下去,欢迎志同道合的朋友一起吹吹牛逼。

相关推荐
熊的猫8 分钟前
ES6 中 Map 和 Set
前端·javascript·vue.js·chrome·webpack·node.js·es6
Pigwantofly2 小时前
软件工程概论项目(二),node.js的配置,npm的使用与vue的安装
node.js
ZJ_.5 小时前
Electron 沙盒模式与预加载脚本:保障桌面应用安全的关键机制
开发语言·前端·javascript·vue.js·安全·electron·node.js
前端SkyRain6 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
丁总学Java7 小时前
使用 npm 安装 Yarn
前端·npm·node.js
理想不理想v7 小时前
执行npm run build -- --report后,生产report.html文件是什么?
java·前端·javascript·vue.js·webpack·node.js
ForRunner1238 小时前
在 Node.js 中解决极验验证码:使用 Puppeteer 自动化
运维·node.js·自动化
丁总学Java10 小时前
npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系
前端·npm·node.js
慧都小妮子15 小时前
借助Aapose.Cells ,在 Node.js 中将 Excel 转换为 JSON
node.js·json·excel·aspose.cells
涛粒子20 小时前
Node.js下载安装及环境配置教程
node.js