10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【NestJS】@nestjs/configを使って環境変数を読み込む

Last updated at Posted at 2020-02-22

やりたいこと

環境変数で設定した値をNestJSアプリ内で使う。

環境

@nestjs/configは、内部的にdotenvを使っています。

ref: https://docs.nestjs.com/techniques/configuration#installation

The @nestjs/config package internally uses dotenv.

dotenvを使う場合の手順はこちら

両方を使ってみて、環境変数の読み込みを一箇所で管理する場合は、dotenvそのものを使うほうが簡便だと感じました。ここでは、備忘録のため設定手順を残しておきます。

面倒な点

  • 環境変数を使いたい場所でConfigServiceをinjectしてconfig.getを使って読み込むのが面倒(具体例は後述)。
    • ドキュメントには書かれていませんが、inject をしなくても .env の内容を process.env.<foo> で呼び出せます(後述)。
  • .env で管理するため、env.example を作り、cp env.example .envするのが、特にチーム開発では面倒。途中で項目追加をすると周知が必要等。(運用方法次第かもしれません)。

お勧め(代替案)

個人的には、node-config をお勧めします。
↑の「面倒な点」が解決できます。
※「面倒な点」の 1点目は inject しなくても process.env.<foo> すれば良いことが分かりました。

インストール

yarn add @nestjs/config

// or

npm install @nestjs/config

使い方

まずsrc/app.module.tsで読みこみます。

src/app.module.ts
import { ConfigModule } from '@nestjs/config' // この行と
:
@Module({
  imports: [ConfigModule.forRoot()],          // この行を追加
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

global moduleとして読み込む場合は、{ isGlobal: true }を渡します。

src/app.module.ts
  imports: [ConfigModule.forRoot({
    isGlobal: true,
    envFilePath: [`.env.${process.env.NODE_ENV}`, `.env`],
    load: [],
  })

実際に環境変数を使いたい場所でConfigServiceをinjectしてconfig.getを使って読み込みます

ref: https://docs.nestjs.com/techniques/configuration#using-the-configservice

このDIを使う手法は、ちょっと面倒に感じます。

src/foo/foo.service.ts
import { ConfigService } from '@nestjs/config'

@Injectable()
export class Foo {
  constructor(
    private readonly config: ConfigService,
  ) {
    const val = this.config.get('SOME_VALUE')

isGlobal: true を設定している場合は以上ですが、設定していない場合は対応するmoduleでinjectします。

src/foo/foo.module.ts
import { ConfigModule, ConfigService } from '@nestjs/config' // ここと

@Module({
  imports: [FooModule, ConfigModule],                        // ここと
  controllers: [FooController],
  providers: [FooService, FooInvoker, ConfigService],	     // ここ

inject しない

上記の「このDIを使う手法は、ちょっと面倒に感じます」については、

imports: [ConfigModule.forRoot()]

を定義していれば、 .env の内容を process.env.<foo> で参照可能なので、回避は可能です。
※ドキュメントにこの利用例の記載はありませんが。

ドキュメント

10
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?