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
})
}
}
イメージ図
プロバイダ(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ファイルにリレーションを登録しておく必要がある。