일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 레벨 1
- Crawling
- Node.js
- HTTP 완벽 가이드
- type challenge
- 백준
- Nestjs
- 소켓
- 알고리즘
- Algorithm
- TCP
- HTTP
- 그래프
- 프로그래머스
- socket
- 프로그래머스 레벨 2
- typescript
- ip
- 자바스크립트
- 가천대
- BFS
- 타입 챌린지
- dfs
- dp
- 쉬운 문제
- 수학
- javascript
- 타입스크립트
- 크롤링
- 문자열
- Today
- Total
kakasoo
Nestia TypeError 확인하기 본문
Nestia에서는 TypeError가 나와도, 상세한 메시지는 알려주지 않았었다.
그저 간단하게 Request body is not promised type, 또는 Reponse body is not promised type, 정도의 에러만이 나왔다.
이것만 가지고는, Nestia에 익숙하지 않은 사람은 어느 부분으로 인해서 에러가 나오는 건지 알기가 어려웠다.
바로 후술하겠지만, 이건 tsconfig.json에서, nestia에 대한 설정을 바꿔주면 해결되는 문제였다.
일단 Nestia는,
아래 링크에서 주석을 확인하면, 보다시피 stringify, assert, is, validate 4가지 메서드를 설정으로 사용한다.
/**
* 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
// 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 결과물을 삭제한 후 다시 해보도록 하자.
'프로그래밍 > NestJS' 카테고리의 다른 글
테스트 코드로 커뮤니케이션하기 (0) | 2023.03.12 |
---|---|
Nestia를 활용한 e2e 테스트 (2) | 2023.03.01 |
Nestia Comment Tags (0) | 2023.03.01 |
You provided an invalid object where a stream was expected. (0) | 2023.02.24 |
Nestia 적용하기 (1) | 2023.02.19 |