簡體   English   中英

我應該配置模塊還是 dotenv?

[英]Should I ConfigModule or dotenv?

首先介紹一下上下文:我的項目中使用了很多環境變量,特別是在我的主文件中,我在其中設置了 CORSCSRF相關的庫或我的 app.module,就像這個例子(不是我的用例):

// main.ts EXAMPLE

  app.use(
    csurf({
      cookie: {
        maxAge: [value],
        sameSite: [value],
        secure: [value],
      },
    }),

  app.enableCors({
    origin: [value],
    methods: [value],
    credentials: [value],
    exposedHeaders: [value],
  });
// app.module.ts EXAMPLE

    GoogleRecaptchaModule.forRoot({
      secretKey: [...],
      response: [...],
      skipIf: [...],
      actions: [...],
      score: [...],
    }),

    ThrottlerModule.forRoot({
      // Config and values
    }),

    ExampleModule.registerAsync({
     // Config and values
  ],

我發現了四種不同的方法(並嘗試了所有方法,但最后一種方法除外):

第一個:將 [value] 更改為 process.env.VALUE,但這使我的代碼變得混亂、聚集且太大,特別是當我必須解析主模塊和模塊中的一些 envvar 時。

// app.module.ts EXAMPLE

[...]
    ExampleModule.registerAsync({
       exampleString: process.env.EXAMPLE_STRING,
       exampleInteger: parseInt(process.env.EXAMPLE_INTEGER),
       example: JSON.parse(process.env.EXAMPLE)
})
[...]

第二:要使用 app.env.ts 文件,它與第一個文件基本相同,但都在一個文件中,而不是直接在我的模塊中使用它,我會這樣:

// app.config.ts EXAMPLE

import * as dotenv from 'dotenv';
dotenv.config();

const env = {
EXAMPLE_STRING: process.env.EXAMPLE_STRING,
EXAMPLE_INTEGER: parseInt(process.env.EXAMPLE_INTEGER),
EXAMPLE: JSON.parse(process.env.EXAMPLE)
}

這會將我的模塊變成:

    ExampleModule.registerAsync({
       exampleString: env.EXAMPLE_STRING,
       exampleInteger: env.EXAMPLE_INTEGER,
       example: env.EXAMPLE
})

第三:使用 NestJS ConfigModule。 在這種情況下,我創建了一個 app.config.ts 文件:

// app.config.ts EXAMPLE

import { ConfigService } from "@nestjs/config"

export const exampleConfig = (config: ConfigService) => {
    return {
        exampleString: config.get('EXAMPLE_STRING'),
        exampleInteger: parseInt(config.get('EXAMPLE_INTEGER')),
        example: JSON.parse(config.get('RECAPTCHA_SKIP')),
    }
}
// app.module.ts EXAMPLE
import { exampleConfig } from './config/app.config';
import { ConfigModule, ConfigService } from '@nestjs/config';

[...]

    ConfigModule.forRoot({
      isGlobal: true
    }),

    ExampleModule.registerAsync({
       inject: [ConfigService],
       exampleConfig 
})
[...]

問題在於 configService 中的 .get() 返回“任何”類型,這就是我考慮下一個的原因

第四:要像上面那樣使用 ConfigModule,但不是那樣使用它,我可以創建一個新的 class 擴展 configService 並覆蓋 .get() 方法,這樣我就可以創建自定義方法,這些方法總是會給我帶來類型化的變量。

我可以創建一個 getBoolean 方法,它與.get() 執行相同的操作,但確保它將返回 boolean,這樣“任何”類型的返回將不再是問題。

這成為我團隊討論的原因是因為我們希望保持我們的代碼盡可能干凈和正確......我想對此有一些想法......這是最好的方法? 還有其他我不知道的方法嗎? 有什么我應該考慮的,還是第四個選項是 go 的好選項?

我更喜歡使用配置。 這是因為,當您使用 TypeScript 時,您在嘗試解析 process.env.VALUE_NAME 中的值時經常會出錯。 它抱怨它是字符串或未定義的。

例如,這是我在使用 Jsonwebtoken 模塊時遇到這個 TypeScript 錯誤的最近問題:

'string | 類型的參數 undefined' 不能分配給'Secret' 類型的參數。 類型“未定義”不可分配給類型“秘密”.ts(2345)

這是因為我使用的是這樣的東西:

import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET;

export function generateToken(data = {}) {
  return jwt.sign(data, secret)
}

為了解決這個問題,我不得不即興創作並寫下了以下幾行:

const secret = process.env.JWT_SECRET != undefined ? 
process.env.JWT_SECRET : "loremIGIDIGI";

為避免出現此類錯誤,建議您使用 Config 方式 go。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM