#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. Я попробовал ваш комментарий, но это все та же проблема :((