createParamDecorator()
연결된 노트와 함께 읽기
문법
data
- createParamDecorator에 전달되는 데이터이다.
context
- 현재 실행 중인 요청과 관련된 데이터를 추출한다.
- 예를 들어 @User를 사용하면 현재 요청된 (접속한) 사용자 객체(req.user)를 반환한다.
export const 데코레이터명 = createParamDecorator((data: unknown, context: ExecutionContext) => {
const req: { } = context.switchToHttp().getRequest();
return req;
});
// src/auth/auth.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { UserEntity } from '../entities/user.entity';
export const User = createParamDecorator((data: unknown, context: ExecutionContext) => {
const req: { user?: UserEntity } = context.switchToHttp().getRequest();
return req.user;
});
export const UserName = createParamDecorator((data: unknown, context: ExecutionContext) => {
const req: { user?: UserEntity } = context.switchToHttp().getRequest();
return req.user.name;
});
export const UserId = createParamDecorator((data: unknown, context: ExecutionContext) => {
const req: { user?: UserEntity } = context.switchToHttp().getRequest();
return Number(req.user.id);
});
// src/resource/user/user.controller.ts
import { Body, Controller, Get, Post, Req, UseGuards } from '@nestjs/common'; import { UserService } from './user.service';
import { CreateUserDto, LoginUserDto } from './dtos/create-user.dto';
import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { LocalServiceAuthGuard } from '../../auth/guards/local-service.guard';
import { AuthService } from '../../auth/auth.service';
import { JwtServiceAuthGuard } from '../../auth/guards/jwt-service.guard'; import { User } from '../../auth/auth.decorator';
import { UserEntity } from '../../entities/user.entity';
@ApiTags('사용자 API')
@Controller('user')
export class UserController {
constructor(private userService: UserService, private authService: AuthService) {}
@ApiOperation({ summary: '사용자 생성 API', description: '사용자를 생성한다.' })
@ApiBody({ type: CreateUserDto })
@Post('join')
async postJoin(@Body() createUserDto: CreateUserDto) {
...
}
// @User() 적용
@ApiOperation({ summary: '사용자 로그인 API', description: '사용자가 로그인을 한다.' })
@UseGuards(LocalServiceAuthGuard)
@ApiBody({ type: LoginUserDto })
@Post('login') async postLogin(@User() user: UserEntity, @Body() loginUserDto: LoginUserDto) {
const token = this.authService.loginServiceUser(user);
return token;
}
@ApiOperation({ summary: '내 정보 조회 API', description: '이름, 메일 등을 조회한다.' })
@UseGuards(JwtServiceAuthGuard)
@Get('profile') async getProfile() {
...
}
}