1. ルーティングとは
ルーティングは、HTTPリクエストを受け取り、それに対して適切なコントローラーのメソッドを呼び出すための仕組みです。NestJSでは、デコレーターを使ってルーティングを簡単に設定することができます。ここでは、基本的なルーティングの使い方と、パラメータ、クエリ、ボディを扱う方法について解説します。
2. 基本的なルーティングの設定
NestJSでは、コントローラーを使ってルーティングを定義します。以下に、簡単なユーザー関連のAPIを作成するためのコードを示します。
2.1 コントローラーの作成
まず、ユーザー関連のコントローラーを作成します。src/user.controller.ts
というファイルを新規作成します。
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
@Controller('users')
export class UserController {
private users = [];
@Post()
create(@Body() user: { name: string; age: number }) {
this.users.push(user);
return user;
}
@Get()
findAll() {
return this.users;
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.users[id];
}
}
このコードでは、以下のエンドポイントを作成しています。
POST /users
: 新しいユーザーを作成するエンドポイント。GET /users
: すべてのユーザーを取得するエンドポイント。GET /users/:id
: 特定のIDのユーザーを取得するエンドポイント。
2.2 サービスの作成
次に、ビジネスロジックを分離するためのサービスを作成します。ファイル名はsrc/user.service.ts
とします。
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
private users = [];
create(user: { name: string; age: number }) {
this.users.push(user);
return user;
}
findAll() {
return this.users;
}
findOne(id: number) {
return this.users[id];
}
}
このサービスは、ユーザーの作成、取得を担当します。
2.3 モジュールへの登録
最後に、コントローラーとサービスをアプリケーションのメインモジュールに登録します。src/app.module.ts
を編集します。
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
imports: [],
controllers: [AppController, UserController],
providers: [AppService, UserService],
})
export class AppModule {}
3. アプリケーションの再起動
アプリケーションを再起動します。ターミナルで以下のコマンドを実行してください。
npm run start
4. APIのテスト
4.1 Postmanを使ったテスト
APIが正常に動作しているかを確認するために、Postmanを使ってテストします。
- ユーザーの作成:
POST /users
エンドポイントに対して以下のJSONデータを送信します。jsonコードをコピーする{ "name": "John Doe", "age": 30 }
- すべてのユーザーを取得:
GET /users
エンドポイントにアクセスすると、作成したユーザーのリストが取得できます。 - 特定のユーザーを取得:
GET /users/0
エンドポイントにアクセスすると、IDが0のユーザーが取得できます。
5. ルーティングの詳細
NestJSでは、ルーティングの設定に多くのオプションがあります。以下にいくつかの重要なデコレーターとその使用例を示します。
5.1 デコレーターの種類
@Get()
: GETリクエストを処理するメソッド。@Post()
: POSTリクエストを処理するメソッド。@Put()
: PUTリクエストを処理するメソッド。@Delete()
: DELETEリクエストを処理するメソッド。@Patch()
: PATCHリクエストを処理するメソッド。@Param()
: URLパラメータを取得するデコレーター。@Body()
: リクエストボディを取得するデコレーター。@Query()
: クエリパラメータを取得するデコレーター。
5.2 ルートパラメータの取得
ルートパラメータは、エンドポイントの一部として指定される値です。以下は、IDをパラメータとして受け取る方法の例です。
@Get(':id')
findOne(@Param('id') id: string) {
return this.users[id];
}
5.3 クエリパラメータの取得
クエリパラメータは、URLの末尾に?key=value
という形式で追加される値です。以下は、クエリパラメータを取得する方法の例です。
@Get()
findAll(@Query('page') page: number) {
// ページネーション処理を行うことができる
return this.users.slice(page * 10, (page + 1) * 10);
}
6. ミドルウェアの利用
ミドルウェアは、リクエストがルーティングハンドラーに到達する前に実行される関数です。これにより、リクエストの処理を拡張したり、カスタムロジックを追加したりすることができます。
6.1 ミドルウェアの作成
ミドルウェアを作成するために、src/logger.middleware.ts
というファイルを作成します。
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`Request... ${req.method} ${req.originalUrl}`);
next();
}
}
このミドルウェアは、リクエストメソッドとURLをログに出力します。
6.2 ミドルウェアの登録
作成したミドルウェアをアプリケーションに登録します。src/app.module.ts
を以下のように変更します。
import { Module, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { LoggerMiddleware } from './logger.middleware';
@Module({
imports: [],
controllers: [AppController, UserController],
providers: [AppService, UserService],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
これにより、すべてのリクエストに対してLoggerMiddleware
が適用されます。
7. まとめ
この第3章では、NestJSのルーティングとミドルウェアについて詳しく解説しました。基本的なルーティングの設定、パラメータやクエリの取得方法、ミドルウェアの作成と登録方法を学びました。