nestjsで.envを利用できるようにする。ついでにdockerも
Table of Contents
- configModuleを追加する
- .envを作成
- nestjsに.envの設定を読み込ませる
- dockerに.envを適応する
1.configModuleを追加する
nestjsではdot-envを拡張した@nestjs/configがあります。
上記を追加します。
$npm i --save @nestjs/config
プロジェクトディレクトリにあるapp.moduleにconfigの読み込みを追加します。
import{Module}from'@nestjs/common';import{ConfigModule}from'@nestjs/config'; ##ここから追記import{AppController}from'./app.controller';import{AppService}from'./app.service';@Module({imports:[##ここから追記ConfigModule.forRoot({}),##ここまで追記],controllers:[AppController],providers:[AppService],})exportclassAppModule{}
これで、読み込みは完了です。
次に .env を作成していきます。
2. .envを作成
.envをproject directoryの下に追加していきます。
サンプルでは、dbの設定とportを追記します。
PORT=3000
NODE_ENV=develop
DB_PORT=3306
DB_USERNAME=develop
DB_PASSWORD=password
DB_DATABASE=develop
DB_HOST=db-server
先ほど追加したapp.module.tsに簡易的によびこませます。
import{Module}from'@nestjs/common';import{ConfigModule}from'@nestjs/config';import{AppController}from'./app.controller';import{AppService}from'./app.service';@Module({imports:[ConfigModule.forRoot({##ここから追記isGlobal:true,envFilePath:'.env'##ここまで追記}),],controllers:[AppController],providers:[AppService],})exportclassAppModule{}
これで読み込みは完了しました。
ついでにenvに読み込ませた、PORTの設定をmain.tsに追記します。
configModuleを追加すると、configServiceを利用することができます。
import{NestFactory}from'@nestjs/core';import{AppModule}from'./app.module';import{ConfigService}from'@nestjs/config';##ここを追記asyncfunctionbootstrap(){constapp=awaitNestFactory.create(AppModule);##ここから追記constconfigService=app.get(ConfigService);awaitapp.listen(configService.get('PORT')||3000);##ここまで追記}bootstrap();
以上です。
ここまで十分開発はそこそこできるのですが、
TypeOrmModuleの設定(webpack hotreloadingだとentity読み込まない)と環境別に設定を分けるための設定を保村していきます。
3. nestjsに.envの設定を読み込ませる
現状は以下のようなディレクトリで、TypeormModuleを利用していることを想定しています。
.
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
├── entity
│ └── user.entity.ts
└── main.ts
設定用のconfig.tsを作成src/config以下に設定します。
$mkdir cofig
$cd config
$touch configuration.ts
作成したconfig/configuration.tsに設定ファイルを読み込ませるように設定を記載します。
exportdefault()=>({port:parseInt(process.env.PORT,10)||3000,database:{type:'mysql',host:process.env.DB_HOST,port:process.env.DB_PORT,username:process.env.DB_USERNAME,password:process.env.DB_PASSWORD,database:process.env.DB_DATABASE,entities:['src/**/**.entity{.ts,.js}'],synchronize:process.env.NODE_ENV==='develop'?true:false,},});
次に設定したconfigurationファイルを読み込ませるようにsrc/app.module.tsに読み込ませます。
import{Module}from'@nestjs/common';importconfigurationfrom'./config/configuration';import{TypeOrmModule}from'@nestjs/typeorm';import{ConfigModule,ConfigService}from'@nestjs/config';import{AppController}from'./app.controller';import{AppService}from'./app.service';@Module({imports:[ConfigModule.forRoot({##ここから追記load:[configuration],isGlobal:true,##ここまで追記}),TypeOrmModule.forRoot({...}),],controllers:[AppController],providers:[AppService],})exportclassAppModule{}
load を追加して記載したファイルを読み込ませることができます。
次に、TypeormModuleのdevelop環境の設定をしていきます。
configuration.tsとapp.moudule.tsに設定を追記していきます。
importentitiesfrom'../entity';// [ ...Entities ]を想定しています。レポ見てもらうとわかるかもexportdefault()=>({port:parseInt(process.env.PORT,10)||3000,database:{type:'mysql',host:process.env.DB_HOST,port:process.env.DB_PORT,username:process.env.DB_USERNAME,password:process.env.DB_PASSWORD,database:process.env.DB_DATABASE,entities:process.env.NODE_ENV==='develop'?entities:['src/**/**.entity{.ts,.js}'],//webpack hot reloadingでも読み込むようにinjectします。synchronize:process.env.NODE_ENV==='develop'?true:false,},});
app.module.tsのTypeormModuleに設定を変更していきます。
import{Module}from'@nestjs/common';importconfigurationfrom'./config/configuration';import{TypeOrmModule}from'@nestjs/typeorm';import{ConfigModule,ConfigService}from'@nestjs/config';import{AppController}from'./app.controller';import{AppService}from'./app.service';@Module({imports:[ConfigModule.forRoot({load:[configuration],isGlobal:true,}),##ここから編集TypeOrmModule.forRootAsync({//forRootではなく、forRootAsyncimports:[ConfigModule],inject:[ConfigService],useFactory:(configService:ConfigService)=>({...configService.get('database'),}),}),##ここまで編集],controllers:[AppController],providers:[AppService],})exportclassAppModule{}
以上でwebpackhot-reloadingの時でも読み込むことができます。
4. dockerに.envを適応する
以下のようにdocker-compoesファイルに直書きしたことを想定しています。
db-serverに、envfileの読みこみとenvironmentの設定をしていきます。
version: '3.7'
services:
api-server:
container_name: api-server
build: .
tty: true
restart: always
ports:
- '3000:3000'
volumes:
- type: bind
source: .
target: /api-server
depends_on:
- db-server
db-server:
container_name: db-server
image: mysql:5.7.29
restart: always
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: develop
MYSQL_USER: develop
MYSQL_PASSWORD: password
version:'3.7'services:api-server:container_name:api-serverbuild:.tty:truerestart:alwaysports:-'3000:3000'volumes:-type:bindsource:.target:/api-serverdepends_on:-db-serverdb-server:container_name:db-serverimage:mysql:5.7.29restart:alwaysports:-'3306:3306'## ここから追記env_file:-.envenvironment:MYSQL_ROOT_PASSWORD:'${DB_PASSWORD}'MYSQL_DATABASE:'${DB_DATABASE}'MYSQL_USER:'${DB_USERNAME}'MYSQL_PASSWORD:'${DB_PASSWORD}'## ここまで追記
以上で設定は完了です。
レポ