Open5
Nest.js 私的メモ
セットアップ
Nest CLIを使う方法
npm i -g @nestjs/cli
- 最初の一回だけ行えばよいグローバルインストール
nest new <プロジェクト名>
- 開発したいプロジェクトの、ルートディレクトリにしたい場所の親ディレクトリで実行する。
- プロジェクト名はケバブケースに変換される(要検証)
npm run start
-
動作確認
-
無事に動くはず
-
(個人的な好みで、)main.ts内のポートの設定を、config.tsファイルからインポートするようにする。
参考
ESLintの設定
詳しくわからないので、メモ。
-
https://www.npmjs.com/package/eslint-plugin-nestjs
- ESLintのnest.js用のプラグイン
-
https://github.com/NullVoxPopuli/eslint-plugin-decorator-position/blob/master/docs/rules/decorator-position.md
- Decoratorの位置のルールを決めることができるESLintの設定
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
と返ってくる
参考
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での指定に関わらず、文字列として扱われている。
工事中
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がバリデーションも兼ねている
参考