Не данные о новом массиве poolList при использовании axios, а консоль.в журнале все еще есть данные

#node.js #api #express #axios

#node.js #API #экспресс #аксиос

Вопрос:

У меня возникли проблемы при создании API с использованием axios. Новый массив не получил данных, содержащих данные, но когда я запускаю console.log(ответ), он отображает данные (см. Прикрепление изображения). Любой может помочь мне в этом вопросе

 router.get('/', async (req, res) =gt; {  const pools = [  'pool1',  'pool2',  ]  const poolList = pools.map(async pool =gt; {  const response = await axios.get(`https://example.com/pools/${pool}/summary.json`)  console.log(response)  return {  response  }  })  res.send({  poolList  }) })  

введите описание изображения здесь

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

1. Попробуй Promise.all(poolList).then(res.send) . Вы также можете захотеть return response.data использовать обратный вызов на карте

2. Я пробовал ваш комментарий, но это все та же проблема

Ответ №1:

Проблема

У вас poolList есть множество обещаний. Затем вы пытаетесь ответить этими обещаниями в виде JSON. Это будет выглядеть примерно так, потому что, когда обещания строятся, они становятся пустыми объектами

 {  "poolList": [{}, {}] }  

Решение

Я подозреваю, что на самом деле вы хотите следующего…

 router.get('/', async (req, res) =gt; {  const pools = [  'pool1',  'pool2',  ]   try {  const poolList = await Promise.all(pools.map(async pool =gt; {  const { data } = await axios.get(`https://example.com/pools/${encodeURIComponent(pool)}/summary.json`)  return data // resolve with the data, not the full Response object  }))   res.json({ poolList })  } catch (err) {  console.error(err)  res.status(500).send(err)  } })  

Это создает массив обещаний, которые разрешаются с удаленными данными (каждое summary.json ), и ожидает каждого из этих обещаний, в результате чего получается массив данных.

Это ответит чем-то вроде

 {  "poolList": [  { /* pool1/summary.json */ },  { /* pool2/summary.json */ }  ] }  

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

1. Он вернул ошибку 404, как показано ниже {message: "Request failed with status code 404"} message: "Request failed with status code 404"

2. @TADA это, вероятно, означает, что по крайней мере один из ваших summary.json URL-адресов неверен

3. да, я понял, большое спасибо Филу, твое предложение отличное :3

Ответ №2:

Это из-за асинхронности pools.map(async pool =gt; { . Ожидаемый результат poolList -это множество обещаний.

постарайтесь дождаться всех

 const pools = [  'pool1',  'pool2', ] const poolList = await Promise.all(pools.map(async pool =gt; {  const response = await axios.get(`https://example.com/pools/${pool}/summary.json`)  console.log(response)  return {  response  } }));   res.send({  poolList })   

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

1. Я попробовал ваш комментарий, но это все та же проблема :((