NestJS
https://scrapbox.io/files/65128241e6449f001beade3c.svg
概要
Under the hood, Nest makes use of robust HTTP Server frameworks like Express (the default) and optionally can be configured to use Fastify as well!
The architecture is heavily inspired by Angular.
メリット
Nest CLI を用いることで、プロジェクトやファイルのテンプレートを作成できる 様々な周辺ツールに対応しており、拡張性が高い
e.g. RDB, NoSQL, GraphQL, WebSocket ...
アーキテクチャ
以下の 3 つのコアとなる要素を用いて、1 つの機能を実装する
Module
Controller
Service
処理フロー
https://scrapbox.io/files/66e0454aa583b0001c585c50.png
Modules
https://docs.nestjs.com/assets/Modules_1.png
関連する Controller や Service をまとめ、アプリケーションとして利用できるように NestJS に登録する
内部で必要となる外部モジュールをインポートしたり、外部にエクスポートしたりする
アプリケーションには必ず 1 つ以上の Root module と、0 個以上の Feature module が必要
Root module(app.module.ts): すべての Feature module を登録する Module
code:app.module.ts
@Module({
})
export class AppModule {}
Feature module: 各機能ごとの Module で、Controller や Service はここで登録する
code:cats/cats.module.ts
@Module({
})
export class CatsModule {}
定義方法(ただし、nest g module コマンドで生成可能)
1. class に @Module デコレータを付与する
2. デコレータにプロパティを記述する
imports: モジュール内部で必要な外部モジュールを記述
exports: 外部にエクスポートしたいモジュールを記述
providers: @Resolver や @Injectable デコレータがついたクラスを記述
controllers: @Controller デコレータがついたクラスを記述
code:ts
@Module({
})
export class TaskModule {}
Controller
https://docs.nestjs.com/assets/Controllers_1.png
クライアントからのリクエストの受け取りとレスポンスの返却を担う
Service
https://docs.nestjs.com/assets/Components_1.png
Resolver / Controller から呼び出すことで、ユースケース を実現する Resolver / Controller でビジネスロジックを記述しても良いが、責務ごとに分割することで 保守性・拡張性 を向上させる 定義方法(ただし、nest g service コマンドで生成可能)
1. class に @Injectable デコレータを用いる
2. ビジネスロジックを実現したメソッドを作成
code:ts
@Injectable()
export class UsersService() {
find(userName: string) {
// ...
}
}
方法
1. Module の providers に依存される側の(@Injectable が付与された)クラスを登録する
code:ts
@Module({
})
export class TaskModule {}
2. 依存する側の コンストラクタ で、依存される側のクラスを引数として受け取る code:ts
@Resolver()
export class TaskResolver {
constructor(private readonly taskService: TaskService) {}
// ...
}
CORS を有効にするには、アプリケーションオブジェクトの enableCORS メソッドを呼び出す
code:main.ts
const app = await NestFactory.create(AppModule);
app.enableCors();
公式ドキュメントにも使用例が示されている
code:src/prisma/prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
}
code:src/prisma/prisma.module.ts
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Module({
})
export class PrismaModule {}
参考