Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8691

nestjsで.envを利用できるようにする。ついでにdockerも

$
0
0

nestjsで.envを利用できるようにする。ついでにdockerも

Table of Contents
  1. configModuleを追加する
  2. .envを作成
  3. nestjsに.envの設定を読み込ませる
  4. dockerに.envを適応する

1.configModuleを追加する

nestjsではdot-envを拡張した@nestjs/configがあります。

上記を追加します。

$npm i --save @nestjs/config

プロジェクトディレクトリにあるapp.moduleにconfigの読み込みを追加します。

src/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({}),##ここまで追記],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に簡易的によびこませます。

src/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を利用することができます。

src/main.ts
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に設定ファイルを読み込ませるように設定を記載します。

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に読み込ませます。

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に設定を追記していきます。

src/config/configuration.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に設定を変更していきます。

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.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の設定をしていきます。

docker-compose.yml(旧)
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
docker-compose.yml
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}'## ここまで追記

以上で設定は完了です。
レポ


Viewing all articles
Browse latest Browse all 8691

Trending Articles