Custom decorators

Custom route decorators

NestλŠ” decoratorsλΌλŠ” μ–Έμ–΄ κΈ°λŠ₯을 μ€‘μ‹¬μœΌλ‘œ κ΅¬μΆ•λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ°μ½”λ ˆμ΄ν„°λŠ” 일반적으둜 μ‚¬μš©λ˜λŠ” λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ 잘 μ•Œλ €μ§„ κ°œλ…μ΄μ§€λ§Œ JavaScript μ„Έκ³„μ—μ„œλŠ” μ—¬μ „νžˆ 비ꡐ적 μƒˆλ‘œμš΄ κ°œλ…μž…λ‹ˆλ‹€. λ°μ½”λ ˆμ΄ν„°μ˜ μž‘λ™ 방식을 더 잘 μ΄ν•΄ν•˜λ €λ©΄ 이 기사λ₯Ό μ½λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. κ°„λ‹¨ν•œ μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ES2016 λ°μ½”λ ˆμ΄ν„°λŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³  λŒ€μƒ, 이름 및 속성 μ„€λͺ…μžλ₯Ό 인수둜 μ‚¬μš©ν•  μˆ˜μžˆλŠ” ν‘œν˜„μ‹μž…λ‹ˆλ‹€. λ°μ½”λ ˆμ΄ν„° μ•žμ— @ 문자λ₯Ό λΆ™μ—¬ μž₯μ‹ν•˜λ €λŠ” 맨 μœ„μ— λ°°μΉ˜ν•˜μ—¬ μ μš©ν•©λ‹ˆλ‹€. 클래슀 λ˜λŠ” 속성에 λŒ€ν•΄ λ°μ½”λ ˆμ΄ν„°λ₯Ό μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Param decorators

NestλŠ” HTTP 라우트 ν•Έλ“€λŸ¬μ™€ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλŠ” μœ μš©ν•œ νŒŒλΌλ―Έν„° λ°μ½”λ ˆμ΄ν„° μ„ΈνŠΈλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” 제곡된 λ°μ½”λ ˆμ΄ν„°μ™€ 이듀이 λ‚˜νƒ€λ‚΄λŠ” 일반 Express (λ˜λŠ” Fastify) 객체의 λͺ©λ‘μž…λ‹ˆλ‹€.

@Request()

req

@Response()

res

@Next()

next

@Session()

req.session

@Param(param?: string)

req.params / req.params[param]

@Body(param?: string)

req.body / req.body[param]

@Query(param?: string)

req.query / req.query[param]

@Headers(param?: string)

req.headers / req.headers[param]

λ˜ν•œ μžμ‹  만의 μ‚¬μš©μž μ •μ˜ λ°μ½”λ ˆμ΄ν„°λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 이것이 μ™œ μœ μš©ν•œκ°€μš”?

node.js μ„Έκ³„μ—μ„œλŠ” μš”μ²­ 객체에 속성을 μ—°κ²°ν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€. 그런 λ‹€μŒ λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 각 경둜 ν•Έλ“€λŸ¬μ—μ„œ μˆ˜λ™μœΌλ‘œ μΆ”μΆœν•˜μ‹­μ‹œμ˜€.

const user = req.user;

μ½”λ“œλ₯Ό 읽기 쉽고 투λͺ…ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ @User()λ°μ½”λ ˆμ΄ν„°λ₯Ό λ§Œλ“€μ–΄ λͺ¨λ“  μ»¨νŠΈλ‘€λŸ¬μ—μ„œ 재 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@@filename(user.decorator)
import { createParamDecorator } from '@nestjs/common';

export const User = createParamDecorator((data, req) => {
  return req.user;
});

Then, you can simply use it wherever it fits your requirements.

@@filename()
@Get()
async findOne(@User() user: UserEntity) {
  console.log(user);
}
@@switch
@Get()
@Bind(User())
async findOne(user) {
  console.log(user);
}

Passing data

λ°μ½”λ ˆμ΄ν„°μ˜ λ™μž‘μ΄ 일뢀 쑰건에 μ˜μ‘΄ν•˜λŠ” 경우 data 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ½”λ ˆμ΄ν„°μ˜ νŒ©ν† λ¦¬ ν•¨μˆ˜μ— 인수λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•œ ν•œ κ°€μ§€ 유슀 μΌ€μ΄μŠ€λŠ” ν‚€λ‘œ μš”μ²­ μ˜€λΈŒμ νŠΈμ—μ„œ νŠΉμ„±μ„ μΆ”μΆœν•˜λŠ” μ‚¬μš©μž μ •μ˜ λ°μ½”λ ˆμ΄ν„°μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 인증 계측이 μš”μ²­μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜κ³  μ‚¬μš©μž 개체λ₯Ό μš”μ²­ κ°œμ²΄μ— μ—°κ²°ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. 인증된 μš”μ²­μ˜ μ‚¬μš©μž μ—”ν‹°ν‹°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{
  "id": 101,
  "firstName": "Alan",
  "lastName": "Turing",
  "email": "alan@email.com",
  "roles": ["admin"]
}

속성 이름을 ν‚€λ‘œ μ‚¬μš©ν•˜λŠ” λ°μ½”λ ˆμ΄ν„°λ₯Ό μ •μ˜ν•˜κ³ , μ‘΄μž¬ν•˜λŠ” 경우 (λ˜λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 λ˜λŠ” μ‚¬μš©μžκ°œμ²΄κ°€ μƒμ„±λ˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ” μ •μ˜λ˜μ§€ μ•Šμ€) μ—°κ΄€λœ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

@@filename(user.decorator)
import { createParamDecorator } from '@nestjs/common';

export const User = createParamDecorator((data: string, req) => {
  return data ? req.user && req.user[data] : req.user;
});
@@switch
import { createParamDecorator } from '@nestjs/common';

export const User = createParamDecorator((data, req) => {
  return data ? req.user && req.user[data] : req.user;
});

μ»¨νŠΈλ‘€λŸ¬μ—μ„œ @User()λ°μ½”λ ˆμ΄ν„°λ₯Ό 톡해 νŠΉμ • 속성에 μ•‘μ„ΈμŠ€ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

@@filename()
@Get()
async findOne(@User('firstName') firstName: string) {
  console.log(`Hello ${firstName}`);
}
@@switch
@Get()
@Bind(User('firstName'))
async findOne(firstName) {
  console.log(`Hello ${firstName}`);
}

이 ν‚€λ₯Ό λ‹€λ₯Έ 킀와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ 속성에 μ•‘μ„ΈμŠ€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. user 객체가 κΉŠκ±°λ‚˜ λ³΅μž‘ν•œ 경우, 더 쉽고 읽기 μ‰¬μš΄ μš”μ²­ ν•Έλ“€λŸ¬ κ΅¬ν˜„μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

Working with pipes

NestλŠ” λ‚΄μž₯ 맀개 λ³€μˆ˜ (@Body(), @Param()및 @Query())와 λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ‚¬μš©μž μ •μ˜ 맀개 λ³€μˆ˜ λ°μ½”λ ˆμ΄ν„°λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ΄λŠ” μ»€μŠ€ν…€ 주석 맀개 λ³€μˆ˜ (이 μ˜ˆμ œμ—μ„œλŠ” user 인수)에 λŒ€ν•΄μ„œλ„ νŒŒμ΄ν”„κ°€ 싀행됨을 μ˜λ―Έν•©λ‹ˆλ‹€. λ˜ν•œ νŒŒμ΄ν”„λ₯Ό μ‚¬μš©μž μ •μ˜ λ°μ½”λ ˆμ΄ν„°μ— 직접 적용 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@@filename()
@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
  console.log(user);
}
@@switch
@Get()
@Bind(User(new ValidationPipe()))
async findOne(user) {
  console.log(user);
}

Last updated

Was this helpful?