Node.js/NestJS

[TIL][NestJS] @Param() 데코레이터 사용 시 주의사항 (+Typeorm)

왈왈디 2023. 5. 19. 18:24
728x90

오늘의 삽질...

controller에서 아래와 같이 단순한 get요청 처리 함수를 만들고

@Get('brands/:id')
getModelsByBrand(@Param() id: number) {
    return this.carsService.getModelsByBrand(id);
}

service에서 아래와 같은 단순한 데이터 조회 쿼리문을 작성하는데,

async getModelsByBrand(id: number) {
const selectedBrand = await this.brandRepository.findOne({
      where: { id: id },
      relations: ['carModels'],
    });
    return selectedBrand.carModels;
  }
}

아무리 다양한 어떤 방법을 써도

Typeorm이 "ER_NON_UNIQ_ERROR: Column 'id' in where clause is ambiguous" 에러를 뱉어냈다.

쿼리문에 문제가 있구나 하고 온갖 방법을 다 해봐도 해결이 안됐다.

다만, id 부분에 상수를 넣어보면 제대로 작동한다는 점이 이상하긴 했다.

 

//시도했던 온갖 시행착오들 

    // const selectedBrand = await this.brandRepository
    //   .createQueryBuilder('brand')
    //   .where('brand.id =:id', { id: brandId })
    //   .leftJoinAndSelect('brand.carModels', 'carModels')
    //   .getOne();

    // const selectedModels = await this.carModelsRepository
    //   .createQueryBuilder('carModel')
    //   .select(['carModel.id', 'carModel.name'])
    //   .where('carModel.brandId = :brandId', { brandId: 2 })
    //   .leftJoinAndSelect('carModel.brand', 'brands')
    //   .getMany();
    // console.log(selectedModels);

    // console.log(selectedBrand);
    // const models = await this.carModelsRepository.findOneBy({ id });
    // console.log(models);
    // return selectedBrand.carModels;
    
    // // await getConnection()
    // .createQueryBuilder()
    // .select({id, name})
    // .where('brand.id = :id', {id})

처음엔 '변수와 데이터의 필드 이름이 같으면 ambiguous 에러를 뱉나' 같은 생각을 하며 변수 이름을 이렇게 저렇게 바꿔봤지만 소용 없었다.

 

대체 뭐가 문제일까 싶어서, 설마하고 controller의 @Param을 param이 아니라 @Qeury로 바꿔야 하나(아님) 하며

검색해보다가 내가 @Param() 데코레이터에 'id' 인자를 빠트렸다는 사실을 알게 됐다.

 

매우 허무하게도 아래와 같이 'id' 인자를 넣어주니 바로 해결됐다.

@Get('brands/:id')
getModelsByBrand(@Param('id') id: number) {
    return this.carsService.getModelsByBrand(id);
}
728x90