web-dev-qa-db-ja.com

dotenvを使用したnestjs設定

このドキュメントを参照する

https://docs.nestjs.com/techniques/configuration

環境変数を使用するには、ConfigServicorderオーダーを使用することをお勧めします。

したがって、コードでは、次のようにアクセスします。

config.get('PORT')

すべての変数は.envファイルで定義されています。

ただし、本番環境で.envを使用することはお勧めしません。それでは、どのように展開するのですか?

Dotenvおよびprocess.env.PORTで標準メソッドを使用しないのはなぜですか?

5
Fairydhwen

ConfigServiceの有用性を低下させる2つの問題があります。

最初

ない場合.envファイルはすべての環境に存在し、readFileSync in

dotenv.parse(fs.readFileSync(filePath))

失敗します:

[Nest] 63403 [ExceptionHandler] path must be a string or Buffer
TypeError: path must be a string or Buffer
    at Object.fs.openSync (fs.js:646:18)
    at Object.fs.readFileSync (fs.js:551:33)
    at new ConfigService (../config/config.service.ts:8:38)

たとえばprocess.env.API_KEY 利用可能です

this.configService.get('API_KEY')

何も返しません。したがって、ConfigServiceprod.envファイル、dotenvが反対するもの:

いいえ。「メイン」の.envファイルと、.env.testのような「環境」の.envファイルを作成しないことを強くお勧めします。設定はデプロイ間で異なる必要があり、環境間で値を共有しないでください。

https://github.com/motdotla/dotenv#should-i-have-multiple-env-files

2番目

使用するには、configモジュールをインポートしてサービスを注入する必要があります。このような環境変数を使用すると

imports: [
  MongooseModule.forRoot(process.env.MONGO_URI, { useNewUrlParser: true }),
  ConfigModule,
],

設定サービスは役に立たない。

環境の構成について詳しくは、こちらをご覧ください: https://12factor.net/config

0
Artjom Zabelin

ただし、本番環境で.envを使用することはお勧めしません。それでは、どのように展開するのですか?

実際、お勧めしませんコミットする .envファイル。これらを本番環境で使用するのはまったく問題ありません:-)。

Dotenvおよびprocess.env.PORTで標準メソッドを使用しないのはなぜですか?

decoupling構成データの提供を担当するコードからコアコードを許可します。したがって:

  • コアコードの方がテストが簡単です。process.envを手動で変更/モックするのはsuch-a-painですが、モックは「ConfigService」はかなり簡単です
  • コード内のすべてのprocess.env.*を置き換えるのではなく、専用クラスの単一のメソッド(またはいくつかのゲッター)を置き換えることで、将来環境変数以外のものを使用することを想像できます//公平にするために、envを使用しているので、これは起こりそうにありません。変数は、構成データをロードするための最も一般的な方法ですが、それでもなお使用できます。
1
VinceOPS