Ответ отправляется до завершения foreach - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь получить коллекцию Firestore с ее подколлекциями. Поэтому я написал облачную функцию Firestore. Но когда я отправляю запрос, я получаю пустой массив обратно. Журнал консоли отображает данные после отправки ответа.

Может кто-нибудь объяснить мне: что я делаю не так?

И я знаю, что код не лучшая практика, но если есть кто-то, кто лучше знает, как получить данные. Я был бы рад услышать это. Спасибо

Мой код:

export const helloWorld = functions.https.onRequest((request, response) => {
  cors(request, response,() => {
    getProfiles()
      .then((data) => {
        console.log(data)
        response.send(data)
      })
      .catch((err) => {
        console.log(err)
      })
  })
})

const getProfiles = async (): Promise<any[]> => {
  const allTrainers: any[] = []
  const trainerProfiles = await db.collection('consultant_profiles').get()

  trainerProfiles.forEach(async (snapshot: DocumentSnapshot) => {
    const profile = snapshot.data()

    if (profile) {
      profile['.key'] = snapshot.id
    }

    const trainerPackets = await db
      .collection('consultant_profiles')
      .doc(snapshot.id)
      .collection('consultant_packets')
      .orderBy('price', 'asc')
      .get()

    const packets: any[] = []
    trainerPackets.forEach((packet: DocumentSnapshot) => {
      packets.push(packet.data())
    })

    const trainerReviews = await db
      .collection('consultant_profiles')
      .doc(snapshot.id)
      .collection('consultant_reviews')
      .get()

    const reviews: any[] = []
    trainerReviews.forEach((review: DocumentSnapshot) => {
      reviews.push(review.data())
    })

    allTrainers.push(profile, packets, reviews)

    console.log(profile, packets, reviews)
  })

  return allTrainers
}

Логи:

[]
9:21:44.586 PM
helloWorld
Function execution took 2717 ms, finished with status code: 200
9:21:44.889 PM
helloWorld
[]
9:21:44.893 PM
helloWorld
Function execution took 1291 ms, finished with status code: 200
9:21:49.268 PM
helloWorld
{ updatedAt: Timestamp { _seconds: 1568747857, _nanoseconds: 790000000 }, first_name: 'Torben', services: [ 'nutrition', 'fitness', 'health' ], description: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', image_url: 'https://www.fillmurray.com/360/360', last_name: 'Müller', '.key': 'VajLDpnbNPPJ3WjR0tKRBZ8bKX63' } [ { userId: 'VajLDpnbNPPJ3WjR0tKRBZ8bKX63', description: 'Drittes Paket ALL INC', price: 89, createdAt: Timestamp { _seconds: 1568747856, _nanoseconds: 878000000 } } ] []

1 Ответ

2 голосов
/ 19 октября 2019

Вы можете использовать Promise.all следующим образом:

...

await Promise.all(trainerProfiles.map(async (snapshot: DocumentSnapshot) => {
    ...
    return true;
}))

return allTrainers

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...