BackEnd/Node.js

[Node.js] NestJS - HTTP module (return type Observable -> Promise)

Cune 2022. 11. 20. 15:33

 


 

아래 공식문서 페이지를 참조하여 글을 작성했습니다.

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

 

@Injectable()
export class TestService {
  constructor(private readonly httpService: HttpService) {}

  //1번해설
  usebasicsObservable(): Observable<AxiosResponse<T>> {
    return this.httpService.get(URL);
  }

  //2번해설
  useAxiosForPromise(): Promise<AxiosResponse<T>> {
   return this.httpService.axiosRef.post(URL, bodyData);
  }
  
  //3번해설
  useValueFromForPromise(): Promise<T> {
  	return await firstValueFrom(
      this.httpService.post(URL, bodyData)
    );
  }
}

 

1번 해설

return this.httpService.get(URL);

- HttpService 메서드는 기본적으로 리턴값이 Observable 객체로 넘어옵니다.

Promise 타입으로 변환해서 받는 방법으로는 2번, 3번해설을 참고하면 됩니다.

 

2번 해설

return this.httpService.axiosRef.post(URL, bodyData);

- 'axiosRef'는 Axios 인스턴스 인터페이스로 리턴값을 Promise 객체로 받습니다.

 

3번 해설

return await firstValueFrom(this.httpService.post(URL, bodyData));

- rxjs의 'firstValueFrom' 또는 'lastValueFrom'을 사용해서 Promise 객체로 받을 수 있습니다.

 

 

firstValueFrom

- Observable 구독하고 첫번째 값이 도착시 즉시 Promise 반환. 구독 종료.

 

lastValueFrom

- Observable 구독하고 완료될 때까지 기다린 후 마지막 값을 Promise 반환.

 

 

응답값을 받아보는 방식에서의 차이점이 있는 것 같습니다.

firstValueFrom(
 this.httpService.get(URL)
).then(value => {
	// value 값 처리
});

value = await lastValueFrom(
 this.httpService.get(URL)
);
// value 값 처리

 

 

아래 링크를 참고해서 작성했습니다.

https://rxjs.dev/api/index/function/firstValueFrom

https://rxjs.dev/api/index/function/lastValueFrom

https://stackoverflow.com/questions/70378974/how-to-use-rxjs-observables-inside-nestjs-application-w-o-controller

 


 

둘다 사용해봤는데 2번과 3번 방법을 어느 상황에서 적절하게 사용해야하는지는 아직 잘 모르겠습니다.

rxjs 라이브러리가 Nest의 내장 패키지로 들어있어서 공식문서 방법대로 쓰긴했지만 이젠 좀더 이해를 하면서 사용해보려고 합니다!