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!' }}