res.send() создает ошибку типа: Преобразование круговой структуры в JSON

#javascript #node.js #express #axios

Вопрос:

Я знаю, что это сообщение об ошибке уже задавалось раньше, но я не верю, что другие решения работают для меня.

Я пытаюсь создать внутренний экспресс-сервер для обработки вызовов API для приложения React. Я написал getData() функцию для этого, используемую an app.post() для отправки ее на интерфейс.

Ошибка появляется только при использовании функции res.send(), например, мои вызовы API работают, просто прерываются при отправке.

Вот соответствующий код:

 const getData = async route =gt; {  const config = {  headers: {  'Authorization': `Bearer ${TOKEN}`,  'Content-Type': 'application/json;charset=utf-8'  }  }   let corrRoute = route[0] == '/' ? route : '/'   route  return await axios(`${URL}${corrRoute}?api_key=${API_KEY}`, config) }   app.post('/api', async (req, res) =gt; {  let { route } = req.body  res.send(await getData(route)) })  

Если я заменю res.send там в конце console.log на него, он будет отлично распечатан. Ошибка создается на сервере index.js файл, а не в приложении React.

Вот полный текст ошибки:

 [server] (node:9680) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON [server] --gt; starting at object with constructor 'ClientRequest'  [server] | property 'socket' -gt; object with constructor 'TLSSocket' [server] --- property '_httpMessage' closes the circle [server] at JSON.stringify (lt;anonymousgt;)  

Комментарии:

1. вы не можете отправить Promise ответ в ответ.

2. Я посылаю Обещание? Я думал await , что гарантировал, что отправлю фактические данные API. Когда я console.log(await getData(route)) возвращаю правильный объект данных, а не что-то вроде Promise lt;promisegt;

3. await getData(route).then(data =gt; res.send(data)) выдает ту же ошибку

Ответ №1:

Axios возвращает гораздо больше, чем просто нужные вам данные. Он возвращает объект ответа, бородавки и все такое, что будет интерпретировано как таковое. И вы отправляете этот объект ответа. Это будет то же самое, что и res.send(res) (за исключением того, что это другой объект ответа).

Чтобы получить фактические данные от Axios, вам нужно будет изменить следующую строку:

 return await axios(`${URL}${corrRoute}?api_key=${API_KEY}`, config)  

Для

 const data = await axios(`${URL}${corrRoute}?api_key=${API_KEY}`, config); return data.data;  

Комментарии:

1. Странно! Я уже несколько раз работал с axios и каким-то образом избежал этой проблемы. Ваш ответ работает.