7 nestjs 环境变量

news2024/11/13 7:56:11

在这里插入图片描述

安装

pnpm i --save @nestjs/config

@nestjs/config 内部使用 dotenv 实现。

配置

一般会在根模块AppModal中导入,并使用.forRoot()静态方法导入它的配置

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';@Module({
  imports: [ConfigModule.forRoot()],
})
export class AppModule {}

以上配置会默认载入并解析一个 .env 文件,从.env文件和process.env合并环境变量键值对,并将结果存储到一个可以通过ConfigService访问的私有结构。forRoot()方法注册了ConfigService提供者,后者提供了一个get()方法来读取这些解析/合并的配置变量。由于@nestjs/config依赖dotenv,它使用该包的规则来处理冲突的环境变量名称。当一个键同时作为环境变量(例如,通过操作系统终端如export DATABASE_USER=test导出)存在于运行环境中以及.env文件中时,以运行环境变量优先。

.env 例子

DATABASE_USER=root
DATABASE_PASSWORD=test

自定义env文件路径

ConfigModule.forRoot({
  envFilePath: '.development.env',
});

// 多个
ConfigModule.forRoot({
  envFilePath: ['.env.development.local', '.env.development'],
});

禁止加载环境变量

ConfigModule.forRoot({
  ignoreEnvFile: true,
});

全局使用配置

ConfigModule.forRoot({
  isGlobal: true,
});

使用yaml方式配置

安装

npm i js-yaml -S
npm i @types/js-yaml -D

在src文件夹下创建一个config目录来放各个环境的配置,这里创建3个环境dev/prod/test

在这里插入图片描述

config/index.ts

import { readFileSync } from 'fs';
import * as yaml from 'js-yaml';
import { join } from 'path';

const configFileName = {
  development: 'dev',
  test: 'test',
  production: 'prod',
};

const env = process.env.NODE_ENV;

export default () => {
  return yaml.load(
    readFileSync(join(__dirname, `./${configFileName[env]}.yml`), 'utf8'),
  ) as Record<string, any>;
};

yml格式的配置文件比如dev.yml

# 数据库配置
db:
  mysql:
    host: 'localhost'
    username: 'root'
    password: '123456'
    database: 'kapok'
    port: 3306
    charser: 'utf8mb4'
    logger: 'advanced-console'
    logging: true
    multipleStatements: true
    dropSchema: false
    synchronize: true
    supportBigNumbers: true
    bigNumberStrings: true

app.module.ts中配置导入yml配置

import configuration from './config/index';@Module({
  imports: [
    ConfigModule.forRoot({
      cache: true,
      load: [configuration],
      isGlobal: true,
    }),
  ],
  controllers: [],
  providers: [],
})

现在如果启动项目的话,大概率yml文件会找不到而报错,此时还需要去配置下cli的配置文件nest-cli.json

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": [
      "**/*.yml"
    ],
    "deleteOutDir": true,
    "watchAssets": true
  }
}

配合 cross-env

pnpm i cross-env -D

修改对应环境的脚本命令

"scripts": {
   "build": "cross-env NODE_ENV=production nest build",
   "start": "cross-env NODE_ENV=development nest start",
   "start:dev": "cross-env NODE_ENV=development nest start --watch",
   "start:debug": "nest start --debug --watch",
   "start:prod": "cross-env NODE_ENV=production node dist/main",
 }

使用配置

import { ConfigService } from '@nestjs/config';@Controller('user')
export class UserController {
 constructor(
   private readonly userService: UserService,
   private configService: ConfigService,
 ) {}@Get()
 findAll() {
   console.log('configService===', this.configService.get('db'));return this.userService.findAll();
 }

配合Joi

pnpm i joi -S

假设去校验开发环境的变量配置和服务启动的端口,可以在配置服务的地方这样做

 ConfigModule.forRoot({
   cache: true,
   load: [configuration],
   isGlobal: true,
   validationSchema: Joi.object({
     NODE_ENV: Joi.string()
       .valid('development', 'production', 'test')
       .default('development'),
     PORT: Joi.number().default(3000),
   }),
   validationOptions: {
     // 控制是否允许环境变量中未知的键 默认为true
     allowUnknown: true,
     // 在遇到第一个错误时就停止验证,如果为false就返回所有错误,默认为false
     abortEarly: true,
   },
 })

这里有个需要注意的地方,引入joi的时候如果是使用esm的方式就需要全部重命名导入

import * as Joi from 'joi'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

降低游戏直播软件开发风险:自建团队、外包公司与现成源码

随着游戏直播行业的快速发展&#xff0c;越来越多的企业和个人开始涉足这一领域。然而&#xff0c;在游戏直播软件的开发过程中&#xff0c;选择合适的开发模式对于降低供应链风险至关重要。本文将探讨三种主要的游戏直播软件开发模式&#xff0c;并分析它们各自的风险管理策略…

设计模式篇(行为型模式 - DesignPattern)(持续更新迭代)(图片待加载)

目录 一、模版方法模式&#xff08;制作豆浆问题&#xff09; 1. 豆浆制作问题 2. 模板方法模式 2.1. 基本介绍 2.2. 代码实现 2.3. 钩子方法 2.4. 应用案例 应用一&#xff1a;Android中View的draw 应用二&#xff1a;Spring 框架应用的源码分析 2.5. 注意事项和细节…

泰国中小企业局局长率考察团到访深兰科技

继泰国社会发展和人类安全部考察团的访问之后&#xff0c;深兰科技本周迎来了第二波泰国政府考察团的莅临。 2024年8月23日&#xff0c;泰国中小企业促进局局长巴尼塔西那瓦女士率领泰国东盟企业家协会、泰国法政大学及泰国企业家代表团访问了深兰科技集团总部。深兰科技集团董…

卡牌抽卡机小程序搭建,探索新鲜有趣的拆卡体验

卡牌作为一种新的潮玩方式&#xff0c;市场热度逐渐提升&#xff0c;在各大社交平台上&#xff0c;拆卡的话题层出不穷&#xff0c;各种卡牌迅速走红&#xff0c;成为了当下“顶流”&#xff0c;吸引了众多的消费者&#xff01;卡牌的价格低&#xff0c;还涉及到了动漫等各个热…

电商行业为什么要做私域?

有伙伴提到&#xff0c;他们所在的电商企业是否有必要进行私域运营&#xff0c;担心投入太大。 实际上&#xff0c;私域运营对于电商企业来说是非常有必要的。它是企业的用户数据资产&#xff0c;关乎着企业未来的发展。私域运营能够帮助企业更好地了解用户需求&#xff0c;提…

Vulkan入门系列17 - 多重采样( Multisampling)

一:概述 我们的程序现在可以加载多个级别的纹理,从而解决了在渲染远离观察者的物体时出现的伪影问题。现在图像变得平滑多了,但仔细观察,你会发现绘制的几何图形边缘呈现锯齿状。这在我们早期渲染一个四边形的程序中尤为明显: 这种不希望有的效果被称为 “锯齿”,…

2024高质量:备战金九银十的Java八股文+场景题,看完这篇就够了!

前言 又到一年金九银十面试跳槽季&#xff0c;你准备好了吗&#xff1f; 今天为大家整理了目前互联网出现率最高的大厂面试题&#xff0c;所谓八股文也就是指文章的八个部分&#xff0c;文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成&#xff0…

Python 数据分析之Numpy学习(二)

Python 数据分析之Numpy学习&#xff08;二&#xff09; 接上文&#xff1a;Python 数据分析之Numpy学习&#xff08;一&#xff09; 四、数组的索引和切片 索引即通过一个无符号整数值获取数组里的值。Python索引是从0的位置开始。 切片即对数组里某个片段的描述。 # 载入…

虚幻5|制作玩家血量,体力(还未编辑,只用于引用)

未编写&#xff0c;仅引用 优化后&#xff1a; 把增加生命&#xff0c;减少生命&#xff0c;也可以用在体力里&#xff0c;更改如下 限制浮点&#xff0c;如果血量或体力按10来扣&#xff0c;如果你的血量降低到5&#xff0c;那么就会以5的数值来扣&#xff0c;而不会扣成-5…

如何在路由器中抓包分析

方法是在openwrt中一般都集成了tcpdump抓包工具&#xff0c;可以通过命令抓包保存为pcap文件&#xff0c;导出来后可以通过wireshark分析。 相信大部分研发人员都在windows下抓过包&#xff0c;最常用的软件就是wireshark&#xff0c;通过wireshark可以很方便的分析数据报文。抓…

理解运营商和全球网络

目录 理解运营商和全球网络 如何上网 光纤入户 购买设备 配置网络 互联网的发展 引入 国家推动 理解运营商和全球网络 如何上网 光纤入户 也就是俗称的拉网线 将光纤宽带服务直接连接到你家中 光纤是由运营商提供 通过玻璃丝传递光电信号,传进来变成模拟信号,再由调制…

【计算机网络】socket网络编程 --- 实现一些简易UDP网络程序

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

笔记整理—uboot启动过程(6)env_init与init_sequence总结

上一章说到uboot的BL2部分板级初始化&#xff0c;这一章将继续对uboot的环境变量初始化内容进行说明。 env_init&#xff0c;顾名思义这是与环境变量相关的初始化。env_init有许多个&#xff0c;因为uboot支持不同的启动介质&#xff08;不同的芯片或开发板&#xff09;。其中i…

Android - 音频参数合入

音频参数宏观来看分为两部分&#xff0c;audio和music。不管是哪个平台都需要分别合入这两部分。 A10 music参数 相关工程师调试后会提供 audio_para 文件&#xff0c;将该文件替换至对应工程下的文件编译即可 例: device/sprd/sharkle/sl8541e_1h10_32b/rootdir/system/et…

练习题 — for循环:数一数有几个字母a? 加油呀

昨天的知识点今天复习了一遍&#xff0c;感觉效果还不错奥&#xff01; 案例题&#xff1a;数一数有几个字母a&#xff1f; count 0 name "itheima is a brand of itcast" for x in name:if x "a":count 1 print(count)#4 完结 &#x1f389; 继续更…

不会用AI?那是你不懂提示词工程!一文读懂提示词,三个原则轻松使用AI

现在市场充斥着大量的AI工具&#xff0c;但是大概80%的人都是把他当作一个搜索引擎&#xff0c;最近小编接到很多后台私信&#xff0c;总结了一下&#xff1a; 1、AI根本没用&#xff1b; 2、AI给出的东西&#xff0c;就是模版&#xff1b; 3、AI给不了想要的内容 这里就有…

PCB中焊盘的注意事项

这种不要在焊盘边上打过孔&#xff0c;不然焊盘损坏修都没法修&#xff1a; 把连接焊盘的飞线拉远点&#xff0c;再打过孔&#xff1a;

Qml中实现多视图,多图像源(QImage / QPixmap)

转自&#xff1a; Qml中实现多视图&#xff0c;多图像源(QImage / QPixmap)_engine.addimageprovider-CSDN博客 【写在前面】 在 Qml 中&#xff0c;实现多视图很容易&#xff0c;无非是多个 Image 而已。 但是&#xff0c;如果需要动态刷新&#xff0c;则变得困难。 再或者&a…

Icepak与RHSC-ET耦合计算Die温度场

目录 1 背景介绍 2 工作流程 2.1 概述 2.2 几何处理 2.3 电热耦合计算温度场 2.4 输出HTC 2.5 RHSC-ET读入HTC 3 求解及总结 以下内容截取自该篇资料 几何处理 • 通过stp文件导入系统散热结构 • 修复几何模型&#xff0c;液冷抽出流体 • 模型简化 电热耦合计算…

Android高级UI --- canvas

前言 我们先来聊聊&#xff0c;在我们生活中如何绘制一张如下的图。 我们需要两样东西来绘制&#xff1a; 一张纸&#xff08;Android 中的 canvas&#xff09;&#xff1a;用来承载我们绘制的内容。一支笔&#xff08;Android 中的 paint&#xff09;&#xff1a;负责绘制内…