kakasoo

Nestia TypeError 확인하기 본문

프로그래밍/NestJS

Nestia TypeError 확인하기

카카수(kakasoo) 2023. 3. 1. 14:47
반응형

Nestia에서는 TypeError가 나와도, 상세한 메시지는 알려주지 않았었다.

그저 간단하게 Request body is not promised type, 또는 Reponse body is not promised type, 정도의 에러만이 나왔다.

이것만 가지고는, Nestia에 익숙하지 않은 사람은 어느 부분으로 인해서 에러가 나오는 건지 알기가 어려웠다.

바로 후술하겠지만, 이건 tsconfig.json에서, nestia에 대한 설정을 바꿔주면 해결되는 문제였다.

 

일단 Nestia는,

아래 링크에서 주석을 확인하면, 보다시피 stringify, assert, is, validate 4가지 메서드를 설정으로 사용한다.

 

 

GitHub - samchon/nestia: Superfast validation decorators for NestJS + Swagger/SDK generator

Superfast validation decorators for NestJS + Swagger/SDK generator - GitHub - samchon/nestia: Superfast validation decorators for NestJS + Swagger/SDK generator

github.com

/**
 * Validate request body.
 * 
 *   - "assert": Use typia.assert() function
 *   - "is": Use typia.is() function
 *   - "validate": Use typia.validate() function
 */

/**
 * Validate JSON typed response body.
 * 
 *   - null: Just use JSON.stringify() function, without boosting
 *   - "stringify": Use typia.stringify() function, but dangerous
 *   - "assert": Use typia.assertStringify() function
 *   - "is": Use typia.isStringify() function
 *   - "validate": Use typia.validateStringify() function
 */

typia method

 

GitHub - samchon/typia: Super-fast Runtime validator (type checker) with only one line

Super-fast Runtime validator (type checker) with only one line - GitHub - samchon/typia: Super-fast Runtime validator (type checker) with only one line

github.com

// RUNTIME VALIDATORS
export function is<T>(input: unknown | T): input is T; // returns boolean
export function assert<T>(input: unknown | T): T; // throws TypeGuardError
export function validate<T>(input: unknown | T): IValidation<T>; // detailed

Nestia는 typia ( 이것도 samchon님 작품이다. ) 라는 라이브러리를 이용해 validator 로직들을 수행한다.

typia에는 3가지 함수에 대한 간단한 설명이 적혀 있는데, Nestia의 기본 설정은 is로 되어 있었다.

is로 되어 있는 경우는 이처럼, Request, Response 타입이 틀렸는지 정도의 간단한 에러만을 제공한다.

 

assert를 사용하더라도 class-transformer보다는 40배 이상의 성능이 나온다고 하는데,

그럼에도 굳이 is가 default 값으로 되어 있던 건,

samchon님 설명으로는 타입 에러가 클라이언트에게 노출되서 좋을 게 없기 때문이라 한다.

 

이 부분은 패치를 통해 assert 가 기본값이 되도록 바꿀 예정이라 한다.

 

tsconfig.json 예시

{
  "compilerOptions": {
    "module": "CommonJS",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2020",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "paths": {
      "../*": ["./src/*"]
    },
    "noEmit": false,
    "typeRoots": ["node_modules/@types", "./src/types/**.*.d.ts"],
    "esModuleInterop": true,
    "plugins": [
      {
        "transform": "@nestia/core/lib/transform",
        "validate": "validate", // "assert", "is", "validate"
        "stringify": "validate" // "stringify", "assert", "is", "validate", null
      },
      {
        "transform": "typia/lib/transform"
      }
    ],
    "strict": true
  },
  "include": ["./src/**/*.ts"],
  "exclude": ["node_modules", "dist", "src/test/**/*.spec.ts"]
}

위에서 설명한 내용들은 모두 plugins의 validate, stringify에 관한 이야기였다.

이 값을 바꾸고도 에러가 나오지 않는 경우에는 build 결과물을 삭제한 후 다시 해보도록 하자.

반응형