やりたいこと
環境変数で設定した値を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> で参照可能なので、回避は可能です。
※ドキュメントにこの利用例の記載はありませんが。
ドキュメント