728x90
반응형

개발하다보면 모든 필드가 필요한 create 이후 모든 필드를 선택사항으로 만드는 update가 필요한 경우가 있다.

이때 Create에 사용한 DTO를 복붙하고 ?를 붙여서 애트리뷰트들은 선택사항으로 만들 수 있지만, Nest.js에서는 이를 쉽게 만들 수 있는 PartialType을 제공한다. PartialType을 적용하는 방법은 다음과 같다.

1. 먼저 @nestjs/mapped-types 를 설치한다.

npm i @nestjs/mapped-types

 

2. Create DTO객체를 extends로 다음과 같이 Update 객체에 연결한다.

import { PartialType } from '@nestjs/mapped-types';
import { CreateMovieDTO } from './create-movie.dto';

export class UpdateMovieDTO extends PartialType(CreateMovieDTO) {}

 

이렇게 쉽게 DTO 입력 유형의 모든 속성이 선택 사항으로 설정된 유형을 만들 수 있다 !

 

참고 : https://docs.nestjs.com/openapi/mapped-types#partial

728x90
반응형
728x90
반응형

ValidationPipe는 Application 수준에서 바인딩해서 모든 엔드포인트가 잘못된 데이터를 수신하지 않도록 보호하는 역할을 한다. 다음과 같이 ValidationPipe를 적용할 수 있다!

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    // 유효성 검사를 위한 파이프
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );
  await app.listen(3000);
}
bootstrap();
  • whitelist : class-validator의 유효성 검사 데코레이터가 없는 애트리뷰트(속성)는 제거한다. 즉, 무관한, 수집하지 않을 데이터가 수신되면, 무시한다.
  • forbidNonWhitelisted : 데코레이터가 없는 애트리뷰트가 수신되면 에러를 내뱉는다. whitelist에서 보안을 강화한 옵션으로, whitelist만 설정되어있을 경우 데코레이터가 없는 애트리뷰트가 수신되면 에러를 내지 않고 무시하지만, 이 옵션은 에러를 발생시킨다는 차이점이 있다.
    • whitelist 가 true로 적용되어있어야 작동한다.
  • transform : DTO 클래스에 따라 유형이 지정된 객체로 자동으로 변환된다. 기본적으로 애트리뷰트는 string으로 수집되고 옵션이 없으면 string으로 가져오지만, transform 을 활성화 하면 number애트리뷰트는 number로 변환하여 수집한다.

disableErrorMessage 와 같이 에러 메시지 명시를 하지 않는 옵션도 있는데, 자세한 에러 메시지를 비활성화해야하는 일부 프로덕션 서비스에서 사용될 수 있다!

여러 옵션을 적용하여 보안과 편의를 증진시킬 수 있다는 점이 흥미로운 ValidationPipe다!

728x90
반응형
728x90
반응형

node.js 의 express-validator처럼 Nest.js 에는 유효성 검증을 할 수 있는 class-validator가 있다. 

@IsString, @IsNumber, @IsOptional 처럼 검증을 쉽고 편하게 할 수 있는 데코레이터를 제공한다.

나는 데이터 전송 객체인 DTO에 다음 예와 같이 데코레이터를 적용해보았다.

import { IsString } from 'class-validator';
import { IsNumber } from 'class-validator';
import { IsOptional } from 'class-validator';

export class CreateMovieDTO {
  @IsString()
  readonly title: string;
  @IsNumber()
  readonly year: number;
  @IsOptional()
  @IsString({ each: true })
  readonly genres: string[];
}

확실히 express-validator 보다 간결하고 보기 좋게 사용할 수 있었다.

배열을 받는 경우 each: true 조건으로 각 항목을 모두 검사하도록 할 수 있다.

 

아래 사진은 위 DTO를 받는 API에 이상한 변수를 삽입하였을때 데코레이터가 어떤 에러를 발생시키는지 확인한 예다.

위 데코레이터 말고도 @MAX(), @IsOptional(), @IsDate() 등 아주 다양한 데코레이터가 있다. 더 알아보고 싶다면 아래 레퍼런스 참고 !

참고 : https://github.com/typestack/class-validator

728x90
반응형
728x90
반응형

class-validator로 DTO형식을 체크하려고 

npm i class-validor 로 설치한 후 예제대로 

import { IsOptional } from 'class-validator/types/decorator/common/IsOptional';

위와 같이 입력하였으나

모듈이 없다는 에러가 자꾸 뜬다 ..

1. class-validator 재설치 시도하였으나 해결안됨

2. class-validator로 경로를 줄여서 해결!

import { IsOptional } from 'class-validator';
728x90
반응형
728x90
반응형

데스크탑 초기화 후 nest 프로젝트를 생성하기 위해 새로 환경을 구성했다.

node --version
npm i -g @nestjs/cli
npm i -g @nestjs/core
npm i -g @nestjs/common

위 명령들은 제대로 먹어서

nest new를 입력했다.

무언가 권한문제로 nest 명령이 안먹는 모양이다

  1. windows PowerShell을 관리자모드로 실행한다.
  2. get-ExecutionPolicy 입력
    1. Restricted 라면 로컬에서 powershell 실행정책이 막혀있는 것이다.
  3. Set-ExecutionPolicy RemoteSigned 입력 -> Y
    1. 신뢰할 수 있는 스크립트는 허용하도록 실행정책 변경
  4. 다시 get-ExecutionPolicy 입력해서 권한 변경되었는지 확인
  5. nest new 명령 입력하여 수행되는지 확인 

 

728x90
반응형

'IT > Nest.js' 카테고리의 다른 글

Nest.js class-validator IsOptional 적용 시 오류  (0) 2023.03.30
Nest.js 데코레이터 사용하기  (0) 2022.12.25
Nest.js 프로젝트 특징  (0) 2022.12.21
728x90
반응형

Nest.Js는 데코레이터를 효율적으로 활용한다. @로 시작하는 데코레이터를 선언하여 사용한다.

 

기본 메소드 데코레이터 : @Get, @Post, @Delete, @Patch ..

변수 데코레이터 : @Body, @Parameter ..

 

기본 데코레이터 활용 예시 

import { Controller, Get, Param, Post, Delete, Patch, Body, Query } from '@nestjs/common';

@Controller('movies')
export class MoviesController {
  @Get()
  getAll() {
    return 'This will return all movies';
  }

  @Get('/search')
  search(@Query('year') searchingYear: string) {
    return `We are searching for a movie made after: ${searchingYear}`;
  }

  @Get('/:id')
  getOne(@Param('id') movieId: string) {
    return `This will return one movie with the id : ${movieId}`;
  }

  @Post()
  create(@Body() movieData) {
    console.log('movieData: ', movieData);
    return movieData;
  }

  @Delete('/:id')
  remove(@Param('id') movieId: string) {
    return `This will delete a movie with the id : ${movieId}`;
  }

  @Patch('/:id')
  patch(@Param('id') movieId: string, @Body() updateData) {
    return {
      updatedMode: movieId,
      ...updateData,
    };
  }
}

 

728x90
반응형

'IT > Nest.js' 카테고리의 다른 글

nest : 이 시스템에서 스크립트를 실행할 수 없으므로..  (0) 2023.02.16
Nest.js 프로젝트 특징  (0) 2022.12.21
Nest.js 프로젝트 설정  (0) 2022.11.13

+ 최근 게시글