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