Вложенные запросы axios от разных веб-сервисов - PullRequest
0 голосов
/ 30 мая 2019

У меня проблема (с использованием NodeJS + Express) при попытке получить в 'users' информацию из 3 разных запросов (2 домена), и я не могу получить то, что хочу. Я бы хотел, чтобы функция getAllUsers () возвращала что-то вроде этого:

[
    {
        "username": "joe_example",
        "plays": 178,
        "friends": 7,
        "uri": "/users/joe_example"
    },
    ...snip additional users...
]

Вот моя основная функция:

async function getAllUsers() {
    let users = await axios.get('http://localhost:8000/friends')
        .then(response => { 
            response.data["friends"].map(user => {
                user = getUser(user.username)
            })
        })
        .catch(error => console.log(error))
    return users 
}

async function getUser(name) {
    let user = await axios.all(
        [
            axios.get('http://localhost:8000/friends/' + name),
            axios.get('http://localhost:8001/plays/' + name)
        ]).then(axios.spread((res1, res2) => {
            user["username"] = name
            user["friends"] = res1.data["friends"].length
            user["plays"] = res2.data["plays"].length
            user["uri"] = "/users/" + name
        })).catch(error => { console.log(error) })
    return user 
}

Да, это может звучать странно ... У службы друзей есть имена пользователей, и вам нужно позвонить /friends/<username>, чтобы узнать количество друзей у каждого пользователя, так же как и /plays/<username>

Есть идеи или предложения? Я перепробовал все, что знаю: (

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Предполагая, что ваш getUser работает и data["friends"] - это массив, как вы ожидаете:

async function getAllUsers() {
  let users;
  try {
    const { data } = await axios.get('http://localhost:8000/friends')
    const friends = data["friends"].map(user => getUser(user.username))
    users = await Promise.all(friends)
  } catch(error) {
    console.log(error)
  }
  return users 
}
0 голосов
/ 30 мая 2019

Это работает очаровательно, вот правильное решение, хорошая помощь, используя Promise.all .Я не знал, насколько это полезно.Я также внес небольшие изменения:

async function getUser(username) {
    let user = {}
    await axios.all(
        [
            axios.get('http://localhost:8000/friends/' + username),
            axios.get('http://localhost:8001/plays/' + username)
        ]).then(axios.spread((res1, res2) => {
            user["username"] = username
            user["friends"] = res1.data["friends"].length
            user["plays"] = res2.data["plays"].length
            user["uri"] = "/users/" + username
        })).catch(error => { console.log(error) })
    return user
}

async function getAllUsers() {
    let users = []
    try{
        const { data } = await axios.get('http://localhost:8000/friends')
        const friends = data["friends"].map(user => getUser(user.username))
        users = await Promise.all(friends)
    } catch(error) { console.log(error) }
    return users
}

Спасибо всем за внимание !!

...