231012(목)_promise, API 라우팅 이슈

박지은·2023년 10월 12일
0

TIL

목록 보기
35/36

참고자료 : 비동기처리 promise

Promise란

자바스크립트 Promise 객체는 비동기 작업의 최종 완료 또는 실패를 나타내는 Array나 Object 처럼 독자적인 객체라고 보면 된다. 비동기 작업이 끝날 때까지 결과를 기다리는 것이 아니라, 결과를 제공하겠다는 '약속'을 반환한다는 의미에서 Promise라 명명 지어졌다고 한다.

Promise void

Promise<void>는 결과 값이 없는 Promise를 나타냅니다. 
즉, Promise가 성공적으로 해결(resolve)될 때 어떠한 값도 반환하지 않을 것임을 의미합니다.

API라우팅 이슈 - parameter사용시 주의할 사항

api 순서를 정할 때 유의해야하는 상황이 있다.
parameter가 들어갈 때!
처음에 순서를 상품전체조회() > 상품상세조회 (':productId')> 상품상위10개항목조회('top10')로 하니까 상품상위10개항목조회에서 계속 오류가 났다.

  • () : 엔드포인트

이 경우에는 /product/top10 엔드포인트는 동작하지 않는다.
왜냐하면, :productId 경로가 더 먼저 정의되어있고, top10이라는 문자열도 ':productId'로 인식될 수 있는 유효한 문자열이기 때문이다.

이 문제를 해결하려면 정적경로를 먼저 작성하고, 그 다음에 동적파라미터가 포함된 경로를 작성해야한다.

parameter가 먼저오면, 그 값을 파라미터로 받기 때문에 보통 가장 마지막에 놔주면 된다.

그래서 아래와 같이 순서를 정렬해서 정상적으로 작동

import {
  Controller,
  Get,
  Param,
  ParseIntPipe,
  UsePipes,
  ValidationPipe,
} from '@nestjs/common';
import { ProductService } from './product.service';
import { GetOneProductDto } from './dto/get.detail.product.dto';

@Controller('product')
// Todo 유효성 검사 파이프 적용, DTO에 정의된 규칙에 맞는지 검사
@UsePipes(new ValidationPipe())
export class ProductController {
  constructor(private productService: ProductService) {}

  //* 상품 전체 조회
  @Get()
  getAllProducts(): Promise<object> {
    return this.productService.getAllProducts();
  }

  //* 상품 상위10개 조회
  @Get('top')
  async getTopDiscountedProducts(): Promise<object> {
    return this.productService.getTop10Products();
  }

  //* 상품 상세 조회
  @Get(':productId') //
  async getProductDetail(@Param('productId', ParseIntPipe) productId: number) {
    const result: GetOneProductDto =
      await this.productService.getProductDetail(productId);

    return result;
  }  
}
profile
성장하는뿅아리

0개의 댓글

관련 채용 정보