NestJS Tips
Overview
NestJSでのTipsをまとめたセクション
Moduleの見方
この @Module デコレーターに出てくる imports、providers、exports は、NestJS におけるモジュールの依存関係管理の中核
- imports 外から使いたいモジュールを読み込む
- providers このモジュール内で使えるクラスや値を登録
- exports 外のモジュールに使わせたいものを公開
@Module({
// 📦 import: 外部から使いたい機能(モジュール)を取り込む
// これは
// • AppRedisCacheModule は、他のモジュール(ここでは AppLoggerModule と CacheModule)に定義された機能を使いたい
// • だからそれを imports に書く
// イメージ:
// このモジュールで AppLogger や CacheManager を注入したいので、まずはそのモジュールを「読み込む」必要がある。
imports: [
AppLoggerModule,
CacheModule.registerAsync({
imports: [AppConfigModule],
inject: [EnvironmentVariables],
useFactory: (env: EnvironmentVariables) => ({
store: createKeyv(env.redisUrl, { useUnlink: true }) as Keyv<string>,
}),
}),
],
// providers: このモジュール内で使えるようにしたいクラスや値
// これは:
// • RedisCacheAdapter や CACHE_REPOSITORY_LOGGER という「依存注入可能なオブジェクト」を、このモジュール内で提供(=DIコンテナに登録)する
// • NestJS の依存解決の仕組みに、「これらを使えるようにしといてね」と伝えている
// イメージ:
// 「このクラス・インスタンスを使いたい人がいたら、ここで生成するから使っていいよ」
providers: [
RedisCacheAdapter,
{
provide: CACHE_REPOSITORY_LOGGER,
inject: [AppLogger],
useFactory: (logger: AppLogger): ILabeledLogger =>
logger.uniqueLabelLogger('redis_cache_adapter'),
},
],
// exports: このモジュールの外で使えるように公開する
// これは
// • このモジュールを import した 別のモジュールからも RedisCacheAdapter を使えるようにする
// • providers にあるものだけが exports できる
// イメージ
// 「これ、他のモジュールでも使っていいよ!エクスポートしとくね!」
exports: [RedisCacheAdapter],
})
export class AppRedisCacheModule {}