Closed4

NestJSについてのメモ書き

Kazuki BandaiKazuki Bandai

Modulesの概念

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})

export class CatsModule {}
  • controllers
    • endpoint生やす
    • Pipe以外で何も処理しない、serviceに処理移譲する
  • providers
    • controllersにDependency InjectionするService class
    • constructorで呼ばれる
constructor(private catsService: CatsService) {}
  • exports
    • そのModule内のservice classを他のclassでもDI出来るようにする

なんでDI/exportするねん

  • Now any module that imports the CatsModule has access to the CatsService and will share the same instance with all other modules that import it as well.

    • CatsModuleをimportしてCatsServiceを使うとき、同じインスタンスを使用するため
Kazuki BandaiKazuki Bandai

Dynamic Modules

  ...
  imports: [ConfigModule.register({ folder: './config' })],
  ...
import { DynamicModule, Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({})
export class ConfigModule {
  static register(options): DynamicModule {
    return {
      module: ConfigModule,
      providers: [
        {
          provide: 'CONFIG_OPTIONS',
          useValue: options,
        },
        ConfigService,
      ],
      exports: [ConfigService],
    };
  }
}
  • 関数名register
    • optionsが引数
    • 返り値はDynamicModuleの型を持たなければならない
  • 'CONFIG_OPTIONS'をConfigServiceへInjectできる
import * as dotenv from 'dotenv';
import * as fs from 'fs';
import { Injectable, Inject } from '@nestjs/common';
import { EnvConfig } from './interfaces';

@Injectable()
export class ConfigService {
  private readonly envConfig: EnvConfig;

  constructor(@Inject('CONFIG_OPTIONS') private options) {
    const filePath = `${process.env.NODE_ENV || 'development'}.env`;
    const envFile = path.resolve(__dirname, '../../', options.folder, filePath);
    this.envConfig = dotenv.parse(fs.readFileSync(envFile));
  }

  get(key: string): string {
    return this.envConfig[key];
  }
}
  • 多分 @Injectable() が必要
    • このクラスには値をInject出来るという意味?
  • @Inject('CONFIG_OPTIONS') でoptionsの引数を拾ってくる
    • options.folder で冒頭の ./config が拾える
  • 環境変数とかに応じて渡したい値を変える時に使えるってことかな
Kazuki BandaiKazuki Bandai

register, forRoot, forFeatureの使い分け

  • https://docs.nestjs.com/fundamentals/dynamic-modules#community-guidelines
  • register
    • そのModuleをいろいろなところで、別の引数で使いたい時、かな
  • forRoot
    • その呼ぶModuleを、同じ引数で複数回使うとき
    • GraphQLModule.forRoot() とかは一回でいいよね、って話
  • forFeature
    • forRootで呼んだModuleをベースにしているが、その呼んだModuleを修正する必要がある呼び出し元のModuleがある場合
    • 例:接続先は環境によって決まるが、どのリポジトリへアクセスするかは後から修正したい時、など
  • これらは厳密に決まっていない
    • There is no hard rule about this, but the @nestjs/ packages try to follow these guidelines.

    • なので厳密に守る必要はないが、メソッド名でimplyできるよねって話
Kazuki BandaiKazuki Bandai

@Module()の定義の理解の仕方

  • documentの原文を読むと大変混乱するが、割とシンプル
  • Module Aの話をするとする
  • 二種類に分けて考える

providers, controllers

  • Module A自体を構成するもの

imports, exports

  • 他のModuleとのconnectionを作るもの
  • exportsに含めれば、他のmoduleがexportsに含めたコードをimport出来るようになる
  • importsに含めれば、他のmuduleからコードをimport出来る

exportsの意味

このスクラップは2023/10/23にクローズされました