Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

axios.post() error about circular structure

Please guide me in case I'm not in proper use of axios. This simple piece of code can directly run:

const axios = require('axios')

axios.post('https://exp.host/--/api/v2/push/send', {"to":["ExponentPushToken[xxxxxxx]"],"title":"test title","body":"test body."})
  .then(responseExpo => {
     console.log("expo replied normally: " + JSON.stringify(responseExpo));
  })
  .catch(error => {
    console.log("expo replied with error: " + JSON.stringify(error,null,4));
  });

The result is:

Promise { <pending> }
expo replied with error: {}

"axios": "^0.19.2"

I tried to post with api tools and see a response with normal 200 status code:

{
  "data":[
  {
    "status": "error",
    "message": "\"ExponentPushToken[xxxxxxx]\" is not a registered push notification recipient",
    "details":{
      "error": "DeviceNotRegistered"
    }
  }
  ]
}

(you may ignore the "error": "DeviceNotRegistered" inside this json cos it's expected because I have put an invalid xxxxx input value when calling the api. Even putting a valid input value the result is still returning to the catch block with empty error)

I'm expecting it to return to the then block cos the server actually response with 200 with well formatted json result.
Have I done something wrong so that the call returns to the catch block? Cos the error is empty I have no idea what went wrong.

=============================== after jfriend's reminder I changed to directly disply the error.

console.log("expo replied with error: " + error);

it is show like this now:

Promise { <pending> }
expo replied with error: TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'ClientRequest'
    |     property 'socket' -> object with constructor 'TLSSocket'
    --- property '_httpMessage' closes the circle

Anyone can let me know what exactly it means and guide me how to correct my usage?

like image 219
Bee Chow Avatar asked Jun 21 '20 06:06

Bee Chow


2 Answers

(problem resolved). the response (responseExpo in the question) is neither a plain data JSON nor a plain string. it is an object with (see github.com/axios/axios#response-schema) some attributes. The real response content is inside "response.data". I was wrongly treating the response to be a plain json object or the http response content.

like image 121
Bee Chow Avatar answered Sep 28 '22 18:09

Bee Chow


I had a similar problem and as solution, I used HttpService from nestjs which returns Observable<AxiosResponse<T>>. I fixed the problem by piping and plucking the request like this:

http.put<T>(url, data, config).pipe(pluck('data'))
like image 31
sakuranasty Avatar answered Sep 28 '22 17:09

sakuranasty