Closed4
NestJSについてのメモ書き
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を使うとき、同じインスタンスを使用するため
Dynamic Modules
- https://docs.nestjs.com/fundamentals/dynamic-modules
- 一言でいうと、どうやってModuleを使うかを、そのModuleを使う側が決めることが出来る機能
- Moduleにstaticなfunctionを生やして、paramsをacceptする
...
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
が拾える
-
- 環境変数とかに応じて渡したい値を変える時に使えるってことかな
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できるよねって話
-
@Module()の定義の理解の仕方
- documentの原文を読むと大変混乱するが、割とシンプル
- Module Aの話をするとする
- 二種類に分けて考える
providers, controllers
- Module A自体を構成するもの
imports, exports
- 他のModuleとのconnectionを作るもの
- exportsに含めれば、他のmoduleがexportsに含めたコードをimport出来るようになる
- importsに含めれば、他のmuduleからコードをimport出来る
exportsの意味
- exportsしたservice classを複数のmoduleで利用したときは、同じインスタンスが利用される
このスクラップは2023/10/23にクローズされました