🛣️

Rails エンジニアが NestJS に入門する:ルーティング編

2022/09/10に公開

前回

https://zenn.dev/gabu/articles/dfba06b43ea3a5

の続きです。

はじめに

NestJS に入門していきなり「モデル層は自分で選んでね!」と公式ドキュメントに言われ、少し脱線して先に Prisma に入門しました。

https://zenn.dev/gabu/articles/f9ce106d626984

https://zenn.dev/gabu/articles/940d4c3fdc0b3d

https://zenn.dev/gabu/articles/a3c153c8127eb9

ということで、Prisma はだいたい分かったので NestJS に戻ってきました。

このシリーズは Rails ガイド の流れで NestJS を学んでみようという企画でやっています。Rails ガイドでは、プロジェクトの作成の次は「ルーティング」「コントローラ」「ビュー」の説明に進みます。ということでまずルーティングの違いについてやっていきたいと思います。

NestJS のルーティング

先に結論ですが、

  • NestJS には config/routes.rb のようなルーティングの設定ファイルはない
  • NestJS はコントローラーのデコレーター @Controller@Get @Post などでルーティングを定義する

ということになります。以下は、Rails のコントローラーの標準的なアクションごとに NestJS でどう定義するのかを簡単にまとめました。

index

cats.controller.ts
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() にマッピングされます。

サンプルのまとめ

cats.controller.ts
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 には無さそうです。

https://github.com/nestjs/nest-cli/issues/15

おわりに

この記事では NestJS のルーティングの基本についてまとめてみました。詳細については公式ドキュメントをご参考ください。

https://docs.nestjs.com/controllers#routing

次は同じページにも説明のあるコントローラーのルーティング以外についてまとめてみたいと思います。

それでは!

株式会社モニクル

Discussion