Categories
Tags
Alamofire Android AppStoreConnect AWS Bun C++ cAdvisor CFW Cloudflare Cloudflare Access Cloudflare KV Cloudflare Tunnel Cloudflare Workers D1 Deno DevContainer Discord Docker ECR ECS Edizon Emulator EmuMMC Fastlane Firestore Frida Ghidra Git GitHub GitHub Actions GitLab GPG Grafana HACGUI Heroku Homebrew Hono IDA Pro iOS IPSwitch Jailbreak Javascript JSON JWT LanPlay Linode macOS Mirakurun MongoDB NestJS NextJS Nintendo Nintendo Switch NodeJS PHP PostgreSQL Prisma Programming Prometheus Python React Realm RealmSwift Ruby Salmon Run Salmonia3+ Shogi Sideload Snap Splatoon Splatoon2 Splatoon3 SSH Stable Diffusion Starlight Swift Swift Package SwiftUI Switch TensorRT Turf War Typescript TypeScript Ubuntu Ubuntu Server VNC VPN VSCode Vue WARP Wireguard XCode Xcode yarn zsh 家電 横歩取り
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/