본문 바로가기
TIL

TIL 240703 - Guard, 커스텀 데코레이터 사용

by lemonpie611 2024. 7. 3.

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의 타입을 지정