Node, Nest, Deno/🦁 Nest - Series

Nest + gql + typeORM(@nestjs/typeorm) (5)Enum

DarrenKwonDev 2020. 11. 23. 03:03
 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

code first와 schema first가 다릅니다. 여기서는 code first 부분만 설명하겠습니다.

 

 

단순히 TypeScript enum을 사용하는 것으로 enum을 만들 수 있습니다.

enum AllowedColor {
  RED,
  GREEN,
  BLUE,
}

 

이 enum type을 gql schema/entity와 같이 쓰기 위해서는 다음과 같이 @nestjs/graphql에서 registerEnumType을 가져와 다음과 같이 감싸주시면 됩니다.

registerEnumType(AllowedColor, {
  name: 'AllowedColor',
});

 

name 외에도 enum 자체에 대한 설명, valuesMap을 통해 세부 enum 속성 각각에 대한 설명, 혹은 deprecated를 붙일 수 있습니다. 다음과 같이 작성한다면 

registerEnumType(AllowedColor, {
  name: 'AllowedColor',
  description: 'The supported colors.',
  valuesMap: {
    RED: {
      description: 'The default color.',
    },
    BLUE: {
      deprecationReason: 'Too blue.',
    }
  }
});

 

gql 상에서는 아래와 같이 변환됩니다.

"""The supported colors."""
enum AllowedColor {
  """The default color."""
  RED
  GREEN
  BLUE @deprecated(reason: "Too blue.")
}
Schema first#

 

 

여튼, gql schema/entity 부분에 다음과 같이 작성함으로서 enum을 사용할 수 있습니다.

@Field(type => AllowedColor)
favoriteColor: AllowedColor;

이제 실제로 사용해보도록하겠습니다.

Enum을 registerEnumType으로 감싼 후 

gql에 해당하는 @Field에는 해당 타입을 반환하고

typeORM에 해당하는 @Column은 아래 첨부한 예시처럼 UserRole을 지정하면 됩니다.

 

import { Field, InputType, ObjectType, registerEnumType } from '@nestjs/graphql';
import { IsString } from 'class-validator';
import { CoreEntity } from 'src/common/entities/core.entity';
import { Column, Entity } from 'typeorm';

enum UserRole {
  Client,
  Owner,
  Delivery,
}

registerEnumType(UserRole, { name: 'UserRole' });

@InputType({ isAbstract: true })
@ObjectType()
@Entity()
export class User extends CoreEntity {
  @Field(() => String) // gql
  @Column() // typeorm
  @IsString() // class-validatior
  email: string;

  @Field(() => String)
  @Column()
  @IsString()
  password: string;

  @Field(() => UserRole)
  @Column({ type: 'enum', enum: UserRole })
  role: UserRole;
}

 

 

Mutation을 날리는 방법은 다음과 같다. String 형태가 아니라 Enum이니까 통짜로 해당 값을 넣어주면 된다.

mutation {
  createAccount(
    input: { email: "test@emai.com", password: "1234", role: Client }
  ) {
    ok
    error
  }
}