【Nest.js】クエリパラメータの取得方法を徹底解説!用途別ベストプラクティスも紹介
必要なもの
- Nest.js がインストールされていること
- TypeScript の基本的な知識
手順
コントローラーの作成:
まず、クエリパラメータを使用するコントローラーを作成する必要があります。 以下のコマンドを使用して新しいコントローラーを作成できます。
nest g controller user
このコマンドは、
UserController
という名前のコントローラーと、それに関連するファイルを生成します。クエリパラメータの装飾:
コントローラーメソッドの引数に
@Query()
デコレータを使用することで、クエリパラメータをバインドできます。 以下の例では、userId
というクエリパラメータを取得し、getUser()
メソッドの引数として使用しています。import { Controller, Get, Query } from '@nestjs/common'; @Controller('user') export class UserController { @Get() getUser(@Query('userId') userId: string): User { // ここで userId を使用してユーザーを取得する } }
上記の例では、
userId
という名前のクエリパラメータが想定されています。 このパラメータは文字列型なので、string
型の変数userId
にバインドされています。クエリパラメータは、必要な型に変換することができます。 これを行うには、
ParseIntPipe
などの変換パイプを使用します。 以下の例では、userId
パラメータを数値に変換しています。import { Controller, Get, Query, ParseIntPipe } from '@nestjs/common'; @Controller('user') export class UserController { @Get() getUser(@Query('userId', ParseIntPipe) userId: number): User { // ここで userId を使用してユーザーを取得する } }
上記の例では、
ParseIntPipe
パイプを使用して、userId
パラメータが数値に変換されるようにしています。オプションのクエリパラメータ:
クエリパラメータはオプションにすることができます。 これを行うには、
@Optional()
デコレータを使用します。 以下の例では、age
という名前のオプションのクエリパラメータを追加しています。import { Controller, Get, Query, Optional } from '@nestjs/common'; @Controller('user') export class UserController { @Get() getUser(@Query('userId') userId: string, @Optional() @Query('age') age: number): User { // ここで userId と age を使用してユーザーを取得する } }
上記の例では、
age
パラメータはオプションなので、@Optional()
デコレータでデコレーションされています。 このパラメータが提供されない場合は、age
変数はundefined
になります。
Nest.js でクエリパラメータを使用するには、@Query()
デコレータを使用します。 このデコレータを使用して、クエリパラメータの名前と型を指定できます。 パラメータの型変換やオプションパラメータの指定も可能です。
Nest.js でクエリパラメータを使用するサンプルコード
import { Controller, Get, Query } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get()
getUser(@Query('userId') userId: string): User {
// ここで userId を使用してユーザーを取得する
}
}
import { Controller, Get, Query, ParseIntPipe } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get()
getUser(@Query('userId', ParseIntPipe) userId: number): User {
// ここで userId を使用してユーザーを取得する
}
}
import { Controller, Get, Query, Optional } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get()
getUser(
@Query('userId') userId: string,
@Optional() @Query('age') age: number,
): User {
// ここで userId と age を使用してユーザーを取得する
}
}
パイプを使用してクエリパラメータをオブジェクトに変換する:
import { Controller, Get, Query, ParseIntPipe } from '@nestjs/common';
import { UserDto } from './user.dto';
@Controller('user')
export class UserController {
@Get()
getUser(@Query('user', ParseIntPipe) userDto: UserDto): User {
// ここで userDto を使用してユーザーを取得する
}
}
この例では、user.dto
という名前の DTO を定義しています。 この DTO には、id
、name
、age
というプロパティがあります。 ParseIntPipe
パイプを使用して、user
クエリパラメータを UserDto
オブジェクトに変換します。
このコードは、Nest.js でクエリパラメータを使用する基本的な方法を示しています。 具体的なニーズに合わせてコードを調整する必要があります。
Nest.js でクエリパラメータを取得するその他の方法
HttpService
を使用して、クエリパラメータを含む HTTP リクエストを手動で作成することができます。 これは、複雑なクエリや、非標準的な方法でクエリパラメータにアクセスする必要がある場合に役立ちます。
長所:
- 柔軟性が高い
- 非標準的なクエリに対応できる
- コードが冗長になる可能性がある
@Query()
デコレータよりもエラーが発生しやすい
import { Injectable, HttpService } from '@nestjs/common';
@Injectable()
export class UserService {
constructor(private readonly httpService: HttpService) {}
getUser(userId: string) {
return this.httpService.get(`https://api.example.com/users/${userId}`)
.pipe(
map(response => response.data),
);
}
}
カスタムパラメータデコレータを作成することで、@Query()
デコレータの動作を拡張することができます。 これは、クエリパラメータの検証や変換を独自に行う必要がある場合に役立ちます。
- クエリパラメータの検証と変換を独自に行うことができる
- 理解するのが難しい場合がある
import { Injectable, ArgumentOutOfRangeException } from '@nestjs/common';
import { createParamDecorator } from '@nestjs/common/decorators';
const ValidateAgePipe = createParamDecorator('ValidateAge', (options) => (
(data, host) => {
const age = parseInt(data, 10);
if (isNaN(age) || age < 18) {
throw new ArgumentOutOfRangeException('age must be a number greater than or equal to 18');
}
return age;
},
));
@Controller('user')
export class UserController {
@Get()
getUser(@Query('age', ValidateAgePipe) age: number): User {
// ここで age を使用してユーザーを取得する
}
}
クエリ文字列を直接解析する:
Request
オブジェクトからクエリ文字列に直接アクセスし、クエリパラメータを手動で解析することができます。 これは、非常にシンプルなクエリしか必要ない場合や、パフォーマンスが重要な場合に役立ちます。
- パフォーマンスが良い
- エラーが発生しやすい
import { Controller, Get, Request } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get()
getUser(@Request() request: Request): User {
const userId = request.query.userId;
// ここで userId を使用してユーザーを取得する
}
}
Nest.js でクエリパラメータを取得するには、いくつかの方法があります。 最適な方法は、具体的なニーズによって異なります。
- シンプルで使いやすい場合は、
@Query()
デコレータを使用するのがおすすめです。 - 複雑なクエリや非標準的なクエリパラメータにアクセスする必要がある場合は、
HttpService
を使用する必要があります。 - クエリパラメータの検証や変換を独自に行う必要がある場合は、カスタムパラメータデコレータを作成する必要があります。
- パフォーマンスが重要な場合は、クエリ文字列を直接解析する必要があります。
javascript node.js typescript