티스토리 뷰
데코레이터
네스트에는 많은 데코레이터가 존재한다.@Body()
, @Param()
등 데코레이터를 통해 특정 요청에 대한 값을 접근할 수 있다.
예를들어 request
객체 안에 body
에 접근하고자 한다면 해당 값을 가져오기 위해 이렇게 작성 할 것이다.
const data= req.body
하지만 여기서 더 readable하고 transparent하게 만들기 위해 @Body()
데코레이터를 사용할 수 있다.
login(@Body('user') loginUserDto: LoginUserDto)
이런식으로 req.body
안에 있는 user의 값을 loginUserDto
라는 변수에 쉽게 담을 수 있다.
커스텀 데코레이터
위에 설명한 데코레이터를 커스텀하여 사용할 수 있다.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);
@nestjs/common
으로 부터 createParamDecorator
를 사용하여 데코레이터를 만들어 주면 된다.
그리고 ctx.switchToHttp().getRequest();
를 통해 request에 접근할 수 있다.
위 함수는 단순히 request로 부터 user 데이터만을 전달 하는 데코레이터 이다.
이제 이렇게 만든 데코레이터를 사용할 수 있다. 조금 더 코드가 직관적으로 바뀌었다.
@Get()
async findOne(@User() user: UserEntity) {
console.log(user);
}
Passing data
커스텀 데코레이터를 @Body()
데코레이터와 같이 특정 key에 대한 값만을 받아올 수 있다.
커스텀 데코레이터를 다음과 같이 구현하면 된다.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator(
(data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
const user = request.user;
return data ? user?.[data] : user;
},
);
이렇게 하면 @User('id')
와 같은 데코레이터 호출이 가능하다.
Etc..
nest에 미리 정의되어있는 데코레이터와 마찬가지로 pipe를 적용하는것과 composition하는 것도 가능하다.
자세한 사용방법은 nest js 공식문서 를 참고하자.
'Nest.js' 카테고리의 다른 글
[Nest.js] 네스트 미들웨어(Nest Middleware) (0) | 2022.01.06 |
---|
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Computer Architecture
- node.js
- nestjs
- dfs
- 동적계획법
- 자바
- nest.js
- 벨만포드
- 투포인터
- boj
- typeORM
- 알고리즘
- ReactNative
- java
- nodeJS
- 백트래킹
- 재귀
- 그리디
- BFS
- 자바스크립트
- 컴퓨터 통신
- 백준
- 세그먼트 트리
- 예외처리
- 시뮬레이션
- 스레드
- 그래프
- 중앙대학교
- 구현
- 컴퓨터 구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
Blog is powered by
Tistory / Designed by
Tistory