NestJS에서 쿼리 매개 변수로 전달 된 값이 문자열이되는 문제에 대해
결론 : 파이프를 사용합시다.
@Get()
async findOne(@Query('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
참고: htps : // / cs. 네 stjs. 코m/피페s
현상에 대해 실제로 움직이고 설명합니다.
버전
$ nest --version
6.12.2
프로젝트 만들기
nest new pipe-test
cd pipe-test
컨트롤러 수정
src/app.controller.tsimport { Controller, Get, Query } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
getTest(@Query('id') id: number, @Query('flg') flg: boolean) {
console.log(id, typeof id);
console.log(flg, typeof flg);
return 'test';
}
}
동작 확인
npm start
로 시작하고 브라우저에서 http://localhost:3000/?id=1&flg=true
에 액세스합니다.
1 string
true string
id/flg는 모두 문자열입니다
파이프를 쓰다
src/app.controller.tsimport { Controller, Get, ParseIntPipe, Query } from '@nestjs/common';
import { ParseBoolPipe } from './pipes/parse-bool.pipe';
@Controller()
export class AppController {
@Get()
getTest(@Query('id', ParseIntPipe) id: number, @Query('flg', ParseBoolPipe) flg: boolean) {
console.log(id, typeof id);
console.log(flg, typeof flg);
return 'test';
}
}
※NestJS6계라고 ParseBoolPipe와 ParseArrayPipe는 없기 때문에, 잡하게 이식해 시험해 보았습니다.
참고: htps : // 기주 b. 코 m / 네 stjs / 네 st / b ぉ b / 뭐 r / 빠 쿠게 s / こもん / ぴぺ s / 빠 루세보오 l. 피페. ts
src/pipes/parse-bool.pipe.tsimport { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from "@nestjs/common";
/**
* Defines the built-in ParseBool Pipe
*
* @see [Built-in Pipes](https://docs.nestjs.com/pipes#built-in-pipes)
*
* @publicApi
*/
@Injectable()
export class ParseBoolPipe
implements PipeTransform<string | boolean, Promise<boolean>> {
protected exceptionFactory: (error: string) => any;
/**
* Method that accesses and performs optional transformation on argument for
* in-flight requests.
*
* @param value currently processed route argument
* @param metadata contains metadata about the currently processed route argument
*/
async transform(
value: string | boolean,
metadata: ArgumentMetadata,
): Promise<boolean> {
if (value === true || value === 'true') {
return true;
}
if (value === false || value === 'false') {
return false;
}
throw new BadRequestException('Validation failed (boolean string is expected)');
}
}
이제 같은 방식으로 http://localhost:3000/?id=1&flg=true
에 액세스합니다.
1 'number'
true 'boolean'
id가 number형으로, flg가 boolean형이 되었습니다!
예상치 못한 값을 전달하면 어떻게됩니까?
예상한 타입 이외의 값을 건네주면 다음과 같은 반환값이 됩니다
@Get()
async findOne(@Query('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
버전
$ nest --version
6.12.2
프로젝트 만들기
nest new pipe-test
cd pipe-test
컨트롤러 수정
src/app.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
getTest(@Query('id') id: number, @Query('flg') flg: boolean) {
console.log(id, typeof id);
console.log(flg, typeof flg);
return 'test';
}
}
동작 확인
npm start
로 시작하고 브라우저에서 http://localhost:3000/?id=1&flg=true
에 액세스합니다.1 string
true string
id/flg는 모두 문자열입니다
파이프를 쓰다
src/app.controller.ts
import { Controller, Get, ParseIntPipe, Query } from '@nestjs/common';
import { ParseBoolPipe } from './pipes/parse-bool.pipe';
@Controller()
export class AppController {
@Get()
getTest(@Query('id', ParseIntPipe) id: number, @Query('flg', ParseBoolPipe) flg: boolean) {
console.log(id, typeof id);
console.log(flg, typeof flg);
return 'test';
}
}
※NestJS6계라고 ParseBoolPipe와 ParseArrayPipe는 없기 때문에, 잡하게 이식해 시험해 보았습니다.
참고: htps : // 기주 b. 코 m / 네 stjs / 네 st / b ぉ b / 뭐 r / 빠 쿠게 s / こもん / ぴぺ s / 빠 루세보오 l. 피페. ts
src/pipes/parse-bool.pipe.ts
import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from "@nestjs/common";
/**
* Defines the built-in ParseBool Pipe
*
* @see [Built-in Pipes](https://docs.nestjs.com/pipes#built-in-pipes)
*
* @publicApi
*/
@Injectable()
export class ParseBoolPipe
implements PipeTransform<string | boolean, Promise<boolean>> {
protected exceptionFactory: (error: string) => any;
/**
* Method that accesses and performs optional transformation on argument for
* in-flight requests.
*
* @param value currently processed route argument
* @param metadata contains metadata about the currently processed route argument
*/
async transform(
value: string | boolean,
metadata: ArgumentMetadata,
): Promise<boolean> {
if (value === true || value === 'true') {
return true;
}
if (value === false || value === 'false') {
return false;
}
throw new BadRequestException('Validation failed (boolean string is expected)');
}
}
이제 같은 방식으로
http://localhost:3000/?id=1&flg=true
에 액세스합니다.1 'number'
true 'boolean'
id가 number형으로, flg가 boolean형이 되었습니다!
예상치 못한 값을 전달하면 어떻게됩니까?
예상한 타입 이외의 값을 건네주면 다음과 같은 반환값이 됩니다
http://localhost:3000/?id=eee&flg=true
{"statusCode":400,"error":"Bad Request","message":"Validation failed (numeric string is expected)"}
http://localhost:3000/?id=1&flg=aaa
{"statusCode":400,"error":"Bad Request","message":"Validation failed (boolean string is expected)"}
※ 이때 controller의 메소드는 실행되지 않습니다.
요약
제공되고 있는 파이프는 적습니다만, 자작할 수도 있으므로 여러가지 할 것 같습니다!
Reference
이 문제에 관하여(NestJS에서 쿼리 매개 변수로 전달 된 값이 문자열이되는 문제에 대해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/teracy164/items/08973e959d750998db11
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(NestJS에서 쿼리 매개 변수로 전달 된 값이 문자열이되는 문제에 대해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/teracy164/items/08973e959d750998db11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)