やりたいこと
環境変数で設定した値をNestJSアプリ内で使う。
環境
@nestjs/config
は、内部的にdotenv
を使っています。
ref: https://docs.nestjs.com/techniques/configuration#installation
The @nestjs/config package internally uses dotenv.
両方を使ってみて、環境変数の読み込みを一箇所で管理する場合は、dotenv
そのものを使うほうが簡便だと感じました。ここでは、備忘録のため設定手順を残しておきます。
面倒な点
-
環境変数を使いたい場所でConfigService
をinjectしてconfig.get
を使って読み込むのが面倒(具体例は後述)。- ドキュメントには書かれていませんが、inject をしなくても
.env
の内容をprocess.env.<foo>
で呼び出せます(後述)。
- ドキュメントには書かれていませんが、inject をしなくても
-
.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
で読みこみます。
import { ConfigModule } from '@nestjs/config' // この行と
:
@Module({
imports: [ConfigModule.forRoot()], // この行を追加
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
global moduleとして読み込む場合は、{ isGlobal: true }
を渡します。
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を使う手法は、ちょっと面倒に感じます。
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します。
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>
で参照可能なので、回避は可能です。
※ドキュメントにこの利用例の記載はありませんが。
ドキュメント