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
'Node.js > NestJS' 카테고리의 다른 글
NestJS 커스텀 프로바이더 사용법 (3) | 2025.01.05 |
---|---|
NestJS API 응답에서 불필요한 프로퍼티를 제외하는 방법 (2) | 2024.08.03 |
NestJS 전역 CacheManager로 Redis 사용하기 (3) | 2024.07.06 |
[NestJS] 각종 트러블 슈팅 (0) | 2023.05.18 |
[NestJS, TypeORM] 배열, 객체 데이터를 database에 저장하는 법 (0) | 2023.05.11 |