해결된 질문
작성
·
779
0
해당 강의를 보면서 회사에 새로운 NestJS & TypeORM 서버를 올려둔 상태입니다.
오늘 발생한 이슈인데 로그에서는 504에러가 발생하였지만 해당 코드를 제외하고 모두 실행되었고 DB 데이터 값까지 수정된 상태였습니다.
이슈가 발생했던 부분의 간단한 코드입니다.
async cancelReservation (body: Dto) {
...
await thirdPartyAPI1(); // 504 exception 발생, 해당 구문을 제외하고 모두 실행완료
await thirdPartyAPI2(); // 결제취소 알림
await thirdPartyAPI3(); // 결제취소 알림
...
return this.repository.save(body);
}
async thirdPartyAPI1() {
// 결제취소 API
try {
...
axios.post(...);
...
} catch (e) {
throw new BadRequestException(e);
}
}
이슈 발생 이후 504 exception 개념에 대해 찾아보았지만 약간 이해만 했을뿐 현 상황에 대해 해결법이 떠오르지 않아 질문드립니다.
async / await 로 구성된 코드에서 await 코드가 완전히 종료되기전까지는 다음 코드를 실행하지 않는것으로 알고 있는데 아래의 코드들이 실행된 이유는 무엇인가요?
스스로 추측하기에는 nest js 자체에서 await 응답대기에 대한 제한시간이 있는것 같은데 정말 있다고 한다면 이 부분에 대해 수정이 가능한가요?
아직 개발경험이 많지않아 애매하게 질문드리는 점 죄송합니다. 단순히 코드의 논리적 오류가 아니라서 구체적인 질문을 하기도 힘드네요 ㅠㅠ 해당문제에 대해 접근을 어떻게해야될지부터가 막막합니다..
추가질문) axios나 nestjs/axios에서 timelimit을 설정할 수 있는것 같은데 이 부분을 설정해줬을때 시간이 초과되면 자동으로 코드실행을 중단하고 exception error를 발생시켜주는지 궁금합니다. 또한 HttpExceptionFilter나 SuccessInterceptor 처럼 글로벌하게 세팅이 되는지도 궁금합니다.
답변 1
1
찾아보니 nest js 공식문서에 time interceptor 코드가 있었고 해당 기능 추가했습니다.
응답시간 지연으로 인해 await를 무시하고 다음 코드가 진행되는 이유는 찾지못했습니다.
timeout exception 발생은 해당 api 서버측에서 오류가 있어 발생했었습니다.
import { Injectable, NestInterceptor, ExecutionContext, CallHandler, RequestTimeoutException } from '@nestjs/common';
import { Observable, throwError, TimeoutError } from 'rxjs';
import { catchError, timeout } from 'rxjs/operators';
@Injectable()
export class TimeoutInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
timeout(5000),
catchError(err => {
if (err instanceof TimeoutError) {
return throwError(() => new RequestTimeoutException());
}
return throwError(() => err);
}),
);
};
};