Rails エンジニアが NestJS に入門する:ルーティング編
前回
の続きです。
はじめに
NestJS に入門していきなり「モデル層は自分で選んでね!」と公式ドキュメントに言われ、少し脱線して先に Prisma に入門しました。
ということで、Prisma はだいたい分かったので NestJS に戻ってきました。
このシリーズは Rails ガイド の流れで NestJS を学んでみようという企画でやっています。Rails ガイドでは、プロジェクトの作成の次は「ルーティング」「コントローラ」「ビュー」の説明に進みます。ということでまずルーティングの違いについてやっていきたいと思います。
NestJS のルーティング
先に結論ですが、
- NestJS には
config/routes.rb
のようなルーティングの設定ファイルはない - NestJS はコントローラーのデコレーター
@Controller
や@Get
@Post
などでルーティングを定義する
ということになります。以下は、Rails のコントローラーの標準的なアクションごとに NestJS でどう定義するのかを簡単にまとめました。
index
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
@Controller('cats')
が /cats
という path prefix になり、@Get()
は引数がないので index になり、結果的に GET /cats
というリクエストがこのコントローラーの findAll()
にマッピングされます。
show
get '/cats/:id', to: 'cats#show'
のように :id
を使いたい場合
@Get(':id')
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}
これで GET /cats/:id
なリクエストが findOne()
にマッピングされ、params.id
で id を参照できます。が、@Param
デコレーターにパラメーター名 'id'
を指定すると、
@Get(':id')
findOne(@Param('id') id: string): string {
return `This action returns a #${id} cat`;
}
のように、findOne()
メソッドの引数 id
に値が注入されます。デコレーターはパワフルですね〜。
create
@Post()
が使えます。
@Post()
create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
これで POST /cats
なリクエストが create()
にマッピングされます。
update
@Put()
が使えます。@Patch()
もあります。
@Put(':id')
update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
return `This action updates a #${id} cat`;
}
これで PUT /cats/:id
なリクエストが update()
にマッピングされます。
destroy(delete)
@Delete
が使えます。
@Delete(':id')
remove(@Param('id') id: string) {
return `This action removes a #${id} cat`;
}
これで DELETE /cats/:id
なリクエストが remove()
にマッピングされます。
サンプルのまとめ
import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';
@Controller('cats')
export class CatsController {
@Post()
create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
@Get()
findAll(@Query() query: ListAllEntities) {
return `This action returns all cats (limit: ${query.limit} items)`;
}
@Get(':id')
findOne(@Param('id') id: string) {
return `This action returns a #${id} cat`;
}
@Put(':id')
update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
return `This action updates a #${id} cat`;
}
@Delete(':id')
remove(@Param('id') id: string) {
return `This action removes a #${id} cat`;
}
}
rails routes
みたいな CLI ある?
rails routes
は生えているルーティングをシュッと確認できて便利ですよね。grep
と組み合わせてよく使います。が、NestJS の公式 CLI には無さそうです。
おわりに
この記事では NestJS のルーティングの基本についてまとめてみました。詳細については公式ドキュメントをご参考ください。
次は同じページにも説明のあるコントローラーのルーティング以外についてまとめてみたいと思います。
それでは!
Discussion