Nest系列:從環境變量到工程化實踐-2

文章目錄

    • @[toc]
    • 一、環境搭建與基礎配置
      • 1.1 安裝驗證(新增完整示例)
      • 1.2 多環境配置示例
    • 二、模塊化配置實戰
      • 2.1 根模塊高級配置
      • 2.2 數據庫模塊專用配置
    • 三、配置獲取最佳實踐
      • 3.1 類型安全獲取示例
      • 3.2 枚舉工程化示例
    • 四、高級場景示例
      • 4.1 動態配置熱更新
      • 4.2 多層級配置合并
    • 五、實用配置技巧
      • 5.1 配置智能提示
      • 5.2 多層級配置合并
    • 六、項目結構建議
      • 推薦配置目錄結構
      • 分層配置示例
    • 七、調試技巧
      • 7.1 配置查看命令
      • 7.2 熱重載配置(開發環境)
    • 八、安全實踐
      • 8.1 敏感信息加密

一、環境搭建與基礎配置

1.1 安裝驗證(新增完整示例)

# 安裝后檢查控制臺輸出
$ npm install @nestjs/config
+ @nestjs/config@9.0.0
added 1 package in 2s# 驗證導入能力
// app.module.ts
import { ConfigModule } from '@nestjs/config'; // 無報錯即成功# 查看版本信息
$ npm list @nestjs/config
└─ @nestjs/config@9.0.0

1.2 多環境配置示例

/
├── .env         # 基礎配置
├── .env.dev     # 開發環境
├── .env.stage   # 預發布環境
└── .env.prod    # 生產環境

動態加載實現:

// app.module.ts
ConfigModule.forRoot({envFilePath: [`.env.${process.env.NODE_ENV}`,  // 按環境加載'.env'                           // 默認配置],expandVariables: true              // 支持變量嵌套
})

變量嵌套示例:

# .env
BASE_URL=/api/v1
USER_SERVICE=${BASE_URL}/users

二、模塊化配置實戰

2.1 根模塊高級配置

// app.module.ts
ConfigModule.forRoot({envFilePath: [`.env.${process.env.NODE_ENV}`, // 動態加載環境文件'.env'                          // 默認配置],isGlobal: true,cache: true,                      // 啟用配置緩存expandVariables: true             // 支持變量擴展
});

2.2 數據庫模塊專用配置

// database.config.ts
export default registerAs('database', () => ({host: process.env.DB_HOST,port: parseInt(process.env.DB_PORT, 10) || 5432,ssl: process.env.NODE_ENV === 'production'
}));// database.module.ts
@Module({imports: [ConfigModule.forFeature(databaseConfig)]
})
export class DatabaseModule {}

三、配置獲取最佳實踐

3.1 類型安全獲取示例

// config.service.ts
getDatabaseConfig() {return {host: this.configService.get<string>('DB_HOST'),port: this.configService.get<number>('DB_PORT', 5432), // 帶默認值timeout: this.configService.getOrThrow<number>('API_TIMEOUT') // 強制存在};
}

3.2 枚舉工程化示例

// config.enum.ts
export enum ConfigKey {Database = 'database',   // 對應注冊的命名空間Redis = 'redis'
}export enum DatabaseKey {Host = 'host',Port = 'port'
}// user.service.ts
const redisConfig = this.configService.get(ConfigKey.Redis);
const dbPort = this.configService.get(`${ConfigKey.Database}.${DatabaseKey.Port}`);

四、高級場景示例

4.1 動態配置熱更新

// 監聽配置變化
constructor(private configService: ConfigService) {configService.get('FEATURE_FLAG').subscribe(value => {this.updateFeatureFlags(value);});
}

4.2 多層級配置合并

# 支持YAML風格嵌套
DATABASE__HOST=cluster.db.example.com
DATABASE__OPTIONS__POOL_SIZE=10
DATABASE__OPTIONS__TIMEOUT=30
// 獲取嵌套配置
const poolSize = configService.get('database.options.poolSize');

五、實用配置技巧

5.1 配置智能提示

// app.config.ts
export default registerAs(ConfigNamespace.App, () => ({env: process.env.NODE_ENV,port: parseInt(process.env.PORT, 10) || 3000,enableSwagger: process.env.SWAGGER_ENABLED === 'true'
}));// 使用時獲得類型提示
this.configService.get(ConfigNamespace.App).enableSwagger

5.2 多層級配置合并

// 支持對象展開語法
const config = this.configService.get('database.connections.master');

六、項目結構建議

推薦配置目錄結構

src/
├─ config/
│  ├─ app.config.ts      # 應用基礎配置
│  ├─ database.config.ts # 數據庫配置
│  ├─ auth.config.ts     # 認證配置
│  └─ validate.ts        # 校驗邏輯
├─ modules/
│  └─ ...               # 業務模塊

分層配置示例

// auth.config.ts
export default registerAs('auth', () => ({secret: process.env.JWT_SECRET,expiresIn: process.env.JWT_EXPIRES_IN || '1h',refreshExpires: process.env.JWT_REFRESH_EXPIRES || '7d'
}));// app.config.ts
export default registerAs('app', () => ({env: process.env.NODE_ENV,port: parseInt(process.env.PORT, 10) || 3000
}));

七、調試技巧

7.1 配置查看命令

# 查看加載的配置
curl http://localhost:3000/config-print

7.2 熱重載配置(開發環境)

// main.ts
if (process.env.NODE_ENV === 'development') {const configService = app.get(ConfigService);fs.watch('.env', () => {configService.reload();console.log('配置文件已重新加載');});
}

八、安全實踐

8.1 敏感信息加密

// 使用crypto解密
import { createDecipheriv } from 'crypto';const decrypt = (text: string) => {const [iv, content] = text.split(':');const decipher = createDecipheriv('aes-256-ctr', ENCRYPT_KEY, Buffer.from(iv, 'hex'));return Buffer.concat([decipher.update(Buffer.from(content, 'hex')),decipher.final()]).toString();
};// 獲取加密配置
const dbPassword = decrypt(configService.get('DB_PASSWORD'));

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72445.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.對象生活的地方—Java環境搭建

1、你要養魚&#xff0c;總得先有一個魚塘吧。挖一個魚塘來養魚&#xff0c;你需要去做下面這些事情&#xff1a; 規劃和設計&#xff1a;確定魚塘的位置、大小和形狀&#xff0c;繪制設計圖。標記和測量&#xff1a;使用測量工具標記魚塘的邊界和深度。挖掘&#xff1a;使用挖…

玩轉大模型——Trae AI IDE國內版使用教程

文章目錄 Trae AI IDE完備的 IDE 功能強大的 AI 助手 安裝 Trae 并完成初始設置管理項目什么是 “工作空間”&#xff1f;創建項目 管理插件安裝插件從 Trae 的插件市場安裝從 VS Code 的插件市場安裝 禁用插件卸載插件插件常見問題暫不支持安裝 VS Code 插件市場中某個版本的插…

數據結構1-4 隊列

一、隊列是什么&#xff1f; 先舉一個日常例子&#xff0c;排隊買飯。 排隊買飯 大家按先來后到的順序&#xff0c;在窗口前排隊買飯&#xff0c;先到先得&#xff0c;買完之后走開&#xff0c;輪到下一位買&#xff0c;新來的人排在隊尾&#xff0c;不能插隊。 可見&#x…

(十 四)趣學設計模式 之 策略模式!

目錄 一、 啥是策略模式&#xff1f;二、 為什么要用策略模式&#xff1f;三、 策略模式的實現方式四、 策略模式的優缺點五、 策略模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;可以多多支…

探秘基帶算法:從原理到5G時代的通信變革【三】Turbo 編解碼

文章目錄 2.2 Turbo 編解碼2.2.1 基本概念與系統構成2.2.2 編碼過程分步解析交織器遞歸系統卷積編碼器復接器總結 2.2.3 譯碼算法分類與原理Turbo碼的強大主要來源于其解碼器理論基礎解碼過程詳解交織與解交織譯碼算法總結 2.2.4 Turbo碼的應用場景無線通信衛星通信深空通信 2.…

Yocto + 樹莓派攝像頭驅動完整指南

—— 從驅動配置、Yocto 構建&#xff0c;到 OpenCV 實戰 在樹莓派上運行攝像頭&#xff0c;在官方的 Raspberry Pi OS 可能很簡單&#xff0c;但在 Yocto 項目中&#xff0c;需要手動配置驅動、設備樹、軟件依賴 才能確保攝像頭正常工作。本篇文章從 BSP 驅動配置、Yocto 關鍵…

TCP協議(20250304)

1. TCP TCP: 傳輸控制協議&#xff08;Transmission Control Protocol&#xff09;&#xff0c;傳輸層協議之一&#xff08;TCP&#xff0c;UDP&#xff09; 2. TCP與UDP UDP&#xff08;用戶數據報協議&#xff09; 面向數據報無連接不安全不可靠&#xff08;盡最大努力交…

NModbus 連接到Modbus服務器(Modbus TCP)

1、在項目中通過NuGet添加NModbus&#xff0c;在界面中添加一個Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…

【零基礎到精通Java合集】第十八集:多線程與并發編程-線程池與Callable/Future應用

課程標題:線程池與Callable/Future應用(15分鐘) 目標:掌握線程池的創建與管理,理解Callable任務與Future異步結果處理機制 0-1分鐘:課程引入與線程池意義 以“銀行窗口服務”類比線程池:復用固定資源(柜員)處理多任務(客戶)。說明線程池的核心價值——避免頻繁創建…

【leetcode hot 100 238】除自身以外數組的乘積

解法一&#xff1a;&#xff08;左右乘積列表&#xff09;利用索引左側所有數字的乘積和右側所有數字的乘積&#xff08;即前綴與后綴&#xff09;相乘得到答案。 class Solution {public int[] productExceptSelf(int[] nums) {int len nums.length;int[] L new int[len]; …

BUU44 [BJDCTF2020]ZJCTF,不過如此1 [php://filter][正則表達式get輸入數據][捕獲組反向引用][php中單雙引號]

題目&#xff1a; 我仿佛見到了一位故人。。。也難怪&#xff0c;題目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后&#xff1a; ......不太行&#xff0c;好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶&#xff1f;那 f…

[Web 安全] PHP 反序列化漏洞 —— POP 鏈構造思路

關注這個專欄的其他相關筆記&#xff1a;[Web 安全] 反序列化漏洞 - 學習筆記-CSDN博客 0x01&#xff1a;什么是 POP 鏈&#xff1f; POP 鏈&#xff08;Payload On Purpose Chain&#xff09;是一種利用 PHP 中的魔法方法進行多次跳轉以獲取敏感數據的技術。它通常出現在 CTF…

擴散語言模型:從圖像生成到文本創造的范式躍遷

近年來,擴散模型(Diffusion Models)在人工智能領域異軍突起,尤其在圖像生成任務中取得了令人矚目的成就,如 Stable Diffusion 等模型已成為生成高質量圖像的標桿。這種成功激發了研究者們的好奇心:擴散模型的魔力能否從視覺領域延伸至自然語言處理(NLP),為文本生成帶來…

大模型工程師學習日記(十):基于 LangChain 構建向量存儲和查詢 Qdrant

Qdrant介紹 Qdrant&#xff08;讀作&#xff1a;quadrant /kwɑdr?nt/ n. 象限&#xff1b;象限儀&#xff1b;四分之一圓&#xff09;是一個向量相似度搜索引擎。它提供了一個生產就緒的服務&#xff0c;具有方便的 API 來存儲、搜索和管理點 - 帶有附加載荷的向量。Qdrant專…

DeepSeek 助力 Vue3 開發:打造絲滑的網格布局(Grid Layout)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

deepseek、騰訊元寶deepseek R1、百度deepseekR1關系

分析與結論 區別與聯系 技術基礎與定制方向&#xff1a; DeepSeek官網R1版本&#xff1a;作為基礎版本&#xff0c;通常保留通用性設計&#xff0c;適用于廣泛的AI應用場景&#xff08;如自然語言處理、數據分析等&#xff09;。其優勢在于技術原生性和官方直接支持。騰訊元寶…

外貿獨立站使用wordpress模板與定制哪個SEO效果好

使用WordPress模板搭建的外貿獨立站與定制站的SEO效果&#xff0c;可以從以下幾個方面進行分析&#xff1a; 1. 內容質量是SEO的核心 內容質量確實是SEO的關鍵&#xff0c;無論使用模板還是定制開發&#xff0c;優質、相關、原創的內容都是提升排名的基礎。內容能夠解決用戶問…

Golang語法特性總結

1.認識Golang代碼特性 package main //1.包含main函數的文件就是一個main包--當前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同時包含多個包 4.強制代碼風格:函數的 { 一定和函數名在同一行&#xff0c;否…

AI賦能校園安全:科技助力預防與應對校園霸凌

校園本應是學生快樂學習、健康成長的地方&#xff0c;然而&#xff0c;校園霸凌卻成為威脅學生身心健康的隱形“毒瘤”。近年來&#xff0c;隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI在校園安全領域的應用逐漸成為解決校園霸凌問題的新突破口。通過…

易語言模擬真人鼠標軌跡算法 - 防止游戲檢測

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序&#xff0c;它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言&#xff0c;原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢&#xff1a; 模擬…