에러 핸들링과 db 조회 시 await을 붙이는 경우와 안붙이는 경우가 궁금합니다.
에러 핸들링의 경우 그냥 throw로 에러를 던져주기만 하는데 await을 붙여 에러를 받아야되는 이유가 궁금합니다.
async checkSoldout({ productId }) {
const product = await this.productRepository.findOne({
where: { id: productId },
});
if (product.isSoldout)
throw new UnprocessableEntityException('이미 판매가 완료된 상품입니다.');
}@Mutation(() => Product)
async updateProduct(
@Args('productId') productId: string,
@Args('updateProductInput') updateProductInput: UpdateProductInput,
) {
// 여기서 에러를 받았을 때 await을 붙여야 정상동작을 하는데 이유가 궁금하네요.
await this.productService.checkSoldout({ productId });
return this.productService.update({ productId, updateProductInput });
}
제가 실험삼아 db를 업데이트 할 때 await을 빼고 로직을 수행해 봤는데 정상적으로 동작하는 듯 보입니다. 이게 왜 동작하는 건지 모르겠네요...
// async await을 모두 제거했습니다. update({ productId, updateProductInput }) { const newProduct = { id: productId, ...updateProductInput, }; return this.productRepository.save(newProduct); }@Mutation(() => Product) async updateProduct( @Args('productId') productId: string, @Args('updateProductInput') updateProductInput: UpdateProductInput, ) { await this.productService.checkSoldout({ productId }); // 리턴을 받을 때도 기다리지 않고 바로 진행했습니다. return this.productService.update({ productId, updateProductInput }); }이 때 서버를 돌리고 쿼리를 실행해보면 정상적으로 수행이 되는데(출력해보면 pending 상태입니다...) 이해가 잘 안되네요..
답변 1
0
안녕하세요. gigo96님
해당 로직에서 await를 제외할 시, 검증(
checkSoldout())이 끝나는 것을 기다리지 않고, 다음 업데이트 로직을 실행하게 됩니다. 따라서 에러 핸들링이 제대로 되지 않은 채, 로직이 수행되게 됩니다. 따라서 검증을 하기 위해 await를 사용하여 해당 로직을 실행하여야 합니다.해당 코드의 로직과 같이 내부 통신만을 필요할 때는 await를 사용하지 않아도 무방합니다. 다만 해당 데이터 값을 확인하기 위해서는 await를 사용해야 pending 상태 없이 값을 콘솔로 확인 가능합니다. 더불어 내부 통신만 하는 경우지만, 로직에 데이터 가공이 필요한 부분이 있다면 이 또한 await를 사용하여 다음 로직이 실행될 때 데이터를 잘 가져와 문제가 생기지 않도록 방지해 주셔야 합니다.
감사합니다.
0
죄송하지만 제가 잘 못 이해한것인지 2번 답변이 잘 이해가 되지 않습니다...
혹시 플레이그라운드에서 api 요청을 보내는 것도 내부 통신에 해당 되는 것인가요? 위 2번 코드로 서버를 실행시키고 플레이그라운드에서 api요청을 보내면 정상적으로 처리되어서 그게 조금 이상해서 질문을 드렸습니다!
제 생각으로는 2번 코드의 경우 api 요청을 보냈을 때 정상적으로 요청이 수행되지 않아야 된다고 생각했는데
사진을 보면 정상적인 요청 수행이 이루어져서 이게 이해가 잘 안갔습니다.
아 그리고 pending 상태를 확인했던 것은 내부적으로 완료되었는지 아닌지 확인하기 위해서 잠깐 체크해봤던것입니다.
1
this.productRepository.save() 등의 모든 로직들은
정상수행하고
결과를 반환합니다.
이 과정에서 안에 들어있는 내용을 확인하고자 할 때에는, await로 기다려야 내부를 확인 가능합니다.
하지만, Nestjs에서는 외부로 나가는 return을 만나게 되면 Nestjs 자체적으로 await를 붙여 기다려주고 완료될 시, 밖으로 내보내 줍니다.
따라서, 브라우저나 플레이그라운드 등에서는 정상적인 결과를 확인할 수 있지만, 콘솔에서는 출력시 pending이 나오게 됩니다. 감사합니다.
그래프 ql 문서 사용할때 느낌표 남는거 어떻게 없애나요?
0
86
2
강의 전체 소스 코드를 받고싶습니다.
0
77
2
fontawesome 사용 문의
0
81
2
소스 코드 부탁드립니다~
0
87
2
깃 레포지터리 소스
0
87
2
커리큘럼12.css 정렬 에 나오는 과제 정답알고싶어요
0
74
2
10-01 Entity TypeOrmModule.forRoot 에 entities
0
89
3
강의 버전관련 문의입니다
0
104
2
Ubuntu 설치 관련
0
62
1
schema.gql 질문 드립니다.
0
51
1
서버 재실행시 Many to Many
0
102
3
input 관련 문의
0
90
2
Rest API 보다는 graphql이 주된 내용인데
0
134
2
강의 전체 소스코드 받을수있을까요?
0
156
1
도커볼륨 마운트 관련
0
127
2
findOne 타입스크립트오류
0
109
1
http => htrtps 호출 인증서 신뢰 오류
0
356
1
self-signed certificate in certificate chain 에러 발생
0
421
1
mongoose 설치 오류
0
143
1
특정 API, 특정 IP 허용 (단일경로에 CORS 활성화)
0
286
2
08-06
0
180
3
구조랑 패턴 관련해서 질문
0
126
2
mydocker
0
129
2
coolsms statuscode 2000 인데 전송안돼는 경우 확인.
0
156
1





