Quantumleap
491 words
2 minutes
NestJSでModule, Service, Controllerの関係性
2024-02-20

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を利用したい場合にここに登録しておくとよい。以下、よく使っているモジュールを紹介しておきます。

で、これらは各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/
Author
tkgling
Published at
2024-02-20