0
0

More than 3 years have passed since last update.

Nest.jsのコンポーネント概要 ~~ コントローラ・プロバイダ編 ~~

Last updated at Posted at 2021-02-14

Nest.js概要

Node.jsのフレームワーク
typescriptで構成され、HttpサーバとしてExpressを使用している。
オプションでFastifyも使用可能。
Babelを使用することで、JavaScriptでも書けるようになる(らしい)

記事の目的

Nest.jsを使う必要が出てきたため、フレームワーク自体と各コンポーネントにおける思想の確認。
使ってみると便利なので、数少ない日本語ドキュメントの助けになれば幸いです。

主なコンポーネント一覧

  • Controllers
  • Providers
  • Modules
  • Middleware
  • Exception filters
  • Pipes
  • Guards
  • Interceptors
  • Custom decorators

今回は、コントローラ(Controllers)とプロバイダ(Providers)に絞って記載します。

ファイル構造(イメージ)

 cats--- cats.controller.ts
     |
     |-- cats.service.ts
     |
     |-- cats.module.ts
     |
     |-- interface -- cats.interface.ts

コントローラ(Controllers)

概要


コントローラは受け取ったリクエストとクライアントへレスポンスを返すことに責任を持つ。
Controllersより抜粋。


  • アプリケーションへの特定のリクエストを受け取ることを目的とするプレゼンテーション層のコンポーネント。
  • 各コントローラは一つ以上のルートを持つ。
  • ルーティングメカニズムによってどのコントローラにリクエストが受け渡されるかが決まる。
  • ファイル名はオブジェクト名.controllers.ts
  • nest-cliの nest g co コントローラ名 で生成できる

サンプルコード

cats.controller.ts
import {Controller, Get} from '@nestjs/common'
import {CatsService} from './cats.service'

// デコレータで最上位階層を指定する。
@Controller('cats')
export class VatsController{
  // 次項目のプロバイダで解説。
  constructor(private catsService: CatsService){}

  // http://example.com/cats に来たgetがルーティングされる。
  @Get()
  findAll(): string {
     return 'このアクションはこの文字列を返す。'
  }

  // http://example.com/cats/create に来たpostがルーティングされる。
  @Post('create')
  // リクエストボディは@Bodyで取得可能
  async create(@Body() body){
    // サービス(Services)については次項目に記載。
    // Dtoを作ればもっと簡略化が可能。(今後記事を書くかもしれません。)
    return this.catsService.create({
       name: body.name,
       age: body.age,
       breed: body.breed
    })
  }
}

イメージ図

Controllers_1.png
公式ドキュメントControllersの記事より

プロバイダ(Providers)

概要

  • Nestの基本的な概念で、Injectable()でデコレートされたもの。
  • サービス、リポジトリ、ファクトリ、ヘルパーなどがプロバイダとして扱われる。
  • プロバイダの特徴として、依存関係を注入(Inject)できることにある。   ### サンプルコード(Service)
cats.service.ts
import { Injectable } from '@nestjs/common'
import { Cat } from './interfaces/cat.interface'

@Injectable()
export class CatsService{
  // Catインターフェイスの配列を初期化
  private readonly cats: Cat[] = []

  create(cat: Cat){
    this.cats.push(cat)
  }

  findAll(): Cat[] {
     return this.cats
  }
}
interfaces/cat.interface.ts

  export interface Cat {
     name: string;
     age: number;
     breed: string;
  }
cats.module.ts
import { Module } from '@nestjs/common'
import { CatsController } from './cats.controller'
import { CatsService } from './cats.service'

@Module({
  imports:[],
  controllers: [CatsController],
  providers: [CatsService],
  exports: []
})

解説(ざっくり)

  constructor(private catsService: CatsService){}

コントローラのサンプルコードの上記部分でコントローラにサービスクラスを注入している。
また、そこのリレーションをつなげるためには、Moduleファイルにリレーションを登録しておく必要がある。

イメージ図

Components_1.png
公式ドキュメントProvidersの記事より

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0