491 words
2 minutes
NestJSでModule, Service, Controllerの関係性
NestJS
NestJSにはよく使う三つの要素としてModule, Service, Controllerがあります。
erDiagram
Module }|..|{ Controller: controllers
Module }|..|{ Service: providers
Module }|..|{ "X Module": imports
そしてX ModuleはY Moduleのような別のモジュールを読み込んでいたりします。
Module
@Module
とついていればModuleになる。
@Module({
controllers: [AppController], // Module -> Controllerを張る
imports: [], // Module <- Moduleを張る
providers: [AppService], // Module -> Serviceを張る
})
export class AppModule {}
imports
には別で提供されているModuleを利用したい場合にここに登録しておくとよい。以下、よく使っているモジュールを紹介しておきます。
PrometheusModule
- アクセスのデータとか集められるModule
PrismaModule
- Prismaが利用できるModule
ThrottlerModule
- アクセス制限をかけられるModule
ConfigModule
- .envを読み込めるやつModule
CacheModule
- キャッシュを利用できるModule
HttpModule
- axiosを利用できるModule
ScheduleModule
- 定期実行が設定できるModule
GraphQLModule
- GraphQLを利用できるModule
で、これらは各Moduleに設定すべきかAppModuleに設定すべきかという問題があるのですが、まあ個人的にはよくわからんのでAppModuleに突っ込もうと思います。
いっぱい入れると立ち上げるのが重くなるのですがLazyModuleLoadを利用すれば良いとのこと、多分。
で、Moduleをimportsに突っ込むときにisGlobal
というオプションを設定できるので、それを設定するとAppModuleに繋がっているController全てで利用できるようになります、多分。
Controller
@Controller()
とついていればControllerになる。
ControllerからはServiceが主に以下のようなコードで利用できる。
@Controller()
export class AppController {
constructor(private readonly service: AppService) {}
async index(): Promise<string> {
return this.service.index() // Serviceのコードが呼べる
}
}
Service
@Injectable()
とついていればServiceになる。
そこは
@Service()
じゃないのか…
@Injectable()
export class AppService {
// Controllerから呼ぶコードを実装する
async index(): Promise<string> {
return 'Hello, World!'
}
}
NestJSでModule, Service, Controllerの関係性
https://fuwari.vercel.app/posts/2024/02/nestjs_module/