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