AuthGuard에서 jwt 인증을 거치고 req.user에서 user정보를 가져왔는데, 객체 속성이 안읽히는 상황..
@Get('/me')
@UseGuards(AuthGuard())
isAuthenticated(@Req() req: Request) {
const user = req.user;
console.log(user);
// const { userId, email, userName, role, birthDate, points } = user; > error
return {
status: 200,
message: '회원정보 조회에 성공했습니다.',
data: {
.
.
},
};
}
알고보니 req.user는 Typescript에서는 Type이 지정이 안되어 있기 때문에, 따로 custom type를 지정해줘야 한다고 한다.
1. Custom decorator 생성
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const UserInfo = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user ? request.user : null;
},
);
- data: 데코레이터에 전달된 데이터, 지금은 사용 X
- ctx: ExecutionContext 객체로, 현재 실행 중인 요청에 대한 정보를 포함
- 데코레이터 함수 내부에서 ctx.switchToHttp().getRequest()를 호출하여 현재 HTTP 요청 객체를 가져옴
- 요청 객체에서 user 속성을 확인하여, 존재하면 그 값을 반환하고, 존재하지 않으면 null을 반환
2. Controller 수정
@Get('/me')
@UseGuards(AuthGuard('jwt'))
isAuthenticated(@UserInfo() user: User) {
const { userId, email, userName, role, birthDate, points, createdAt, updatedAt } = user;
console.log('a');
return {
status: 200,
message: '회원정보 조회에 성공했습니다.',
data: {
userId,
email,
userName,
role,
birthDate,
points,
createdAt,
updatedAt
},
};
}
@Req 대신 @UserInfo 커스텀 데코레이터를 설정하여 req.user의 타입을 지정
'TIL' 카테고리의 다른 글
TIL 240705 - 알고리즘 코드카타 리뷰 - 타겟 넘버 (0) | 2024.07.05 |
---|---|
TIL 240704 - UpdateValuesMissingError 에러해결 / Isolation Level 적용 (0) | 2024.07.04 |
TIL 240702 - 의존성 주입 문제 해결 (0) | 2024.07.02 |
TIL 240701 - javascript/typescript에서 날짜 한국표준시각으로 변경 (0) | 2024.07.01 |
TIL 240628 - Nest.js에서 Provider란? / useValue, useClass, useFactory 사용법 (0) | 2024.06.28 |