Open5

Nest.js 私的メモ

ID_157ID_157

セットアップ

Nest CLIを使う方法

npm i -g @nestjs/cli
  • 最初の一回だけ行えばよいグローバルインストール
nest new <プロジェクト名>
  • 開発したいプロジェクトの、ルートディレクトリにしたい場所の親ディレクトリで実行する。
  • プロジェクト名はケバブケースに変換される(要検証)
npm run start
  • 動作確認

  • 無事に動くはず

  • (個人的な好みで、)main.ts内のポートの設定を、config.tsファイルからインポートするようにする。

参考

https://docs.nestjs.com/first-steps

ID_157ID_157

Controllerを作成する

nest g controller <Controllerの名前>
  • src/<controllerの名前> 以下に、~.controller.tsと~.contoller.spec.tsが作成される

GETを受け取って、メッセージを返す

src/cats/cats.controller.ts
import { Controller } from '@nestjs/common';

@Controller('cats')
export class CatsController {}
  • 反応したいリクエストメソッドのデコレータをimportする
  • デコレータには、Get, Post, Put, Patch, Delete, Head, Options が存在

例えば、GETでメッセージを返したい場合は、

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

@Controller('cats')
export class CatsController {
  @Get()
  index(): string {
    return 'All Cats!'
  }
}

動的なルーティング

src/cats/cats.controller.ts
import { Controller, Get, Param } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  index(): string {
    return 'All Cats!';
  }
  @Get(':id')
  show(@Param() params): string {
    return `My cat ID is ${params.id}`
  }
}
  • http://localhost:~/cats/1にアクセスすると、My cat ID is 1 と返ってくる

GETのクエリパラメータを受け取る

src/cats/cats.controller.ts
import { Controller, Get, Query } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  index(): string {
    return 'All Cats!';
  }
  @Get(':id')
  show(@Query() query): string {
    return `My cat ID is ${query.id}`
  }
}
  • http://localhost:~/cats/1?id=2にアクセスすると、My cat ID is 2 と返ってくる

参考

https://docs.nestjs.com/controllers

ID_157ID_157

Controllerを作成する ~2~

POSTリクエストを受け取る

  • POSTリクエストのpayloadを受け取るためには、DTO(Data Transfer Object)により、受け取るデータの型を指定する必要がある。
src/cats/create-cat.dto.ts
export class CreateCatDto {
  name: string
  color: string
}
src/cats/cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common'
import { CreateCatDto } from './create-cat.dto'

@Controller('cats')
export class CatsController {
  @Get()
  index(): string {
    return 'All Cats!'
  }
  @Post()
  create(@Body() createCatDto: CreateCatDto): string {
    return `Create cat! {name: ${createCatDto.name} color: ${createCatDto.color}}`
  }
}
  • curl -X POST -H "Content-Type: application/json" -d '{"name":"mike", "color":"calico"}' localhost:~/catsで、Create cat! {name: mike color: calico}が返ってくる

POSTリクエストのpayloadの型について

src/cats/create-cat.dto.ts
export class CreateCatDto {
  name: string
  color: string
  age: number
}
src/cats/cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common'
import { CreateCatDto } from './create-cat.dto'

@Controller('cats')
export class CatsController {
  @Get()
  index(): string {
    return 'All Cats!'
  }
  @Post()
  create(@Body() createCatDto: CreateCatDto): string {
    return `Create cat! {name: ${createCatDto.name} color: ${createCatDto.color} typeOfAge: ${typeof createCatDto.age}}`
  }
}
  • curl -X POST -H "Content-Type: application/json" -d '{"name":"mike", "color":"calico", "age":"2"}' localhost:~/catsで、Create cat! {name: mike color: calico typeOfAge: string}が返ってくる。
  • DTOでの指定に関わらず、文字列として扱われている。
ID_157ID_157

工事中

Pipeを利用する

Pipeの役割

  • バリデーション
  • 型変換

Pipeの利用法は以下の3通り(?)

  • contextにバインドする
  • Schema based validation
    • joiというライブラリを用いる
  • Class validator
    • DTOのクラス内に記述

contextにバインドする

src/cats/cats.controller.ts
import { Controller, Get, Post, Body, ParseIntPipe } from '@nestjs/common'

@Controller('cats')
export class CatsController {
  @Get()
  index(): string {
    return 'All Cats!'
  }
  @Post()
  create(
    @Body('name') name,
    @Body('color') color,
    @Body('age', ParseIntPipe) age,
  ): string {
    return `Create cat! {name: ${name} color: ${color} typeOfAge: ${typeof age}}`
  }
}
  • curl -X POST -H "Content-Type: application/json" -d '{"name":"mike", "color":"calico", "age":"2"}' localhost:~/catsで、Create cat! {name: mike color: calico typeOfAge: number}が返ってくる。
    • ageがちゃんとnumberに変換されている
  • curl -X POST -H "Content-Type: application/json" -d '{"name":"mike", "color":"calico", "age":"hoge"}' localhost:~/catsで、{"statusCode":400,"message":"Validation failed (numeric string is expected)","error":"Bad Request"}が返ってくる。
    • Parseがバリデーションも兼ねている

参考

https://docs.nestjs.com/pipes#schema-based-validation
https://docs.nestjs.com/techniques/validation