27

This simple demo has an error https://docs.nestjs.com/techniques/http-module

import { Get, Controller, HttpService } from '@nestjs/common';
import { AxiosResponse } from 'axios'
import { Observable } from 'rxjs'
@Controller()
export class AppController {
  constructor(private readonly http: HttpService) {}
  @Get()
  root(): Observable<AxiosResponse<any>>  {
    return this.http.get('https://api.github.com/users/januwA');
  }
}

What should I do?

[Nest] 7356   - 2018-10-18 00:08:59   [ExceptionsHandler] Converting circular structure to JSON +9852ms
TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)

nest i
common version : 5.1.0
core version   : 5.1.0
Kim Kern
  • 54,283
  • 17
  • 197
  • 195
januw a
  • 2,056
  • 5
  • 18
  • 39

4 Answers4

48

You cannot just return the whole AxiosResponse object because it cannot be serialized to JSON. You most likely want to get the response data like this:

@Get()
root() {
  return this.http.get('https://api.github.com/users/januwA').pipe(
    map(response => response.data)
  );
}

or alternatively using Promises:

@Get()
async root() {
  const response = await this.http.get('https://api.github.com/users/januwA').toPromise();
  return response.data;
}
Kim Kern
  • 54,283
  • 17
  • 197
  • 195
4

You have to make sure to handle your responses as a JSON you can return it as a promise and get the data, use one of both or HttpService or axios

import { Get, Controller, HttpService } from '@nestjs/common';
@Controller()
export class AppController {
  constructor(private readonly http: HttpService) {}
  @Get()
      root(): {
        return this.http.get('https://api.github.com/users/quen2404')
        .toPromise()
        .then(res => res.data)
        .catch(err => /*handle error*/)
      }
}
Thibault Walterspieler
  • 2,272
  • 2
  • 15
  • 25
Juan Velasquez
  • 385
  • 4
  • 15
2

as you write in your example, get method return AxiosResponse<> and contains circular reference. So if you want to proxify webservice https://api.github.com/users/januwA, you should return AxiosResponse.data :

import { Get, Controller, HttpService } from '@nestjs/common';
import { AxiosResponse } from 'axios'
import { Observable } from 'rxjs'
@Controller()
export class AppController {
  constructor(private readonly http: HttpService) {}
  @Get()
  root(): Observable<any>{
    return this.httpClient.get('https://api.github.com/users/quen2404')
      .pipe(map(response => response.data));
  }
}
quen2404
  • 245
  • 1
  • 2
  • 11
2

toPromise() is deprecated so this is the updated answer:

import { firstValueFrom } from 'rxjs';
import { HttpService } from '@nestjs/axios';
...
const response = await firstValueFrom(this.httpService.get('/api'));
return response.data;
}
Masih Jahangiri
  • 9,489
  • 3
  • 45
  • 51