NestJS에서 쿼리 매개 변수로 전달 된 값이 문자열이되는 문제에 대해

10679 단어 NestJSapi
NestJS로 API를 작성했을 때에, 쿼리 파라미터로 number나 boolean를 건네주면(자) 문자열이 되어 버려, 일부러 스스로 변환하고 있었습니다만, 변환하는 방법이 준비되어 있었습니다. .

결론 : 파이프를 사용합시다.


@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.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의 메소드는 실행되지 않습니다.

    요약



    제공되고 있는 파이프는 적습니다만, 자작할 수도 있으므로 여러가지 할 것 같습니다!

    좋은 웹페이지 즐겨찾기