🙄

NestJsのdocsをやってみる

2024/11/21に公開

はじめに

このnestjsのdocsを触りながらメモを残していく
殴り書きのメモなので悪しからず。

OVERVIEW

環境構築

nodeはインストール済みなのでプロジェクトを作るところから

npm i -g @nestjs/cli
nest new project-name

ファイル構造・概要

そもそも

npmで起動した時にmain.tsが明示していないのに呼ばれるのはnest-cli.jsonで"sourceRoot": "src",が指定されているからっぽい。
main.tsのエントリーポイントになる関数がbootstrapという名前は慣習的なもので、自力で起動するという意味があるらしい。

設計モデル

MVCモデルという、プログラムを役割ごとにModel(モデル)・View(ビュー)・Controller(コントローラー)の3つに分けて管理するソフトウェア設計モデルを使っている。

  • Model
    • ビジネスロジックを担当。DBとの接続とか。
  • View
    • 表示や入出力などのユーザーインターフェースを担当。
  • Controller
    • ModelとViewの制御を担当。ユーザーとの繋ぎになる部分で、ModelやViewに指示を送る。テレビのリモコンと同じイメージ。
src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts

main.ts

エントリーポイント。

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
  • NestFactoryはアプリのインスタンスを作るためのクラス。モジュールをapp化する。
  • 作成したappをポート3000で公開。
  • async/awaitについては非同期処理を調べること。

app.controller.ts

ルーティングを管理する

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}
  • @Controllerというデコレーターの引数にパスを指定することで、ルーティングを設定できる。今回だと、ルートに設定される。@Controller('hoge')にするとlocalhost:3000/hogeにパスが通る。
  • constructorはクラスが作成される時に動くもので、引数にAppServiceをappServiceとして受け取り、インスタンス化している。
  • AppServiceはprivate属性なので、AppControllerクラスの中からしか呼び出すことはできない。(安全)
  • @GetはGETリクエストのときに動く関数。今回だとappService.getHelloを呼び出すようにしている。具体的なビジネスロジックはserviceに書かれる。

app.service.ts

ビジネスロジックが書かれる。

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}
  • @InjectableデコレーターはNestjsにおいて、クラス間の依存関係を解決するため(簡単に書くため)に使われる。これをDI(Dependency Injection)という。

app.module.ts

モジュール化を行い、依存関係を解決する

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • ここではAppControllerとAppServiceをまとめてAppModuleとしてモジュール化している。
  • importsに別のmoduleをかくことで使用することができる
  • providers
    • providerの意味の通り、色々機能を提供するものが入る。今回だと実際の処理を提供するServiceを指定している。

*.spec.ts

  • テストコードが書かれている

Discussion