Ожидаемые данные не будут получены с помощью вложенных запросов Google DataStore, написанных в Express / Node - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь реализовать вложенные datastore запросы в Node/express.Родительский запрос - это простой запрос get для kind, а дочерний запрос агрегирует определенный столбец из других kind на основе определенного значения столбца родительских kind результатов, полученных выше.Пожалуйста, проверьте код ниже для лучшего понимания.

app.get("/api/venues/", (req, res, next) => {
  const query = datastore
  .createQuery('venue');

  // parent query run here
  query.run().then(([venuesList]) => {
  venuesList.forEach(
    venue => {
      startDate = moment(new Date()).format('L');
      endDate = moment(new Date()).startOf('week').format('L');
      const queryVenueInvoice = datastore
      .createQuery('invoices')
      .filter('targetacntkey', '=', venue.userid);

      // child query run here
      queryVenueInvoice.run().then(([invoicesList]) => {
        const filteredInvoiceList = invoicesList.filter( invoice =>
          (new Date(invoice.timestamp).toISOString().split('T')[0])
          <= startDate && (new Date(i.timestamp).toISOString().split('T')[0]) >= (endDate));

          venue['weeklySummary'] = filteredInvoiceList.reduce((sum, invoice) => {
            return sum + invoice.totalamount; }, 0);
        })

      venue['venueKey'] = venue[datastore.KEY]
    }
    );
  // venuesList.forEach(venue => console.log(venue));
  res.status(200).json(
    {
      message: "Request was processed successfully!",
      venues: venuesList
    }
  );
})
})

Я могу получить ответ в виде массива venuesList, заполненного venueKey.Однако я не могу увидеть агрегированное свойство weeklySummary в ответе.Что мне здесь не хватает?Кто-нибудь ведет меня так, чтобы увидеть ожидаемые результаты?

1 Ответ

0 голосов
/ 19 февраля 2019

Похоже, вы пытаетесь выполнить асинхронные операции в вашем venuesList.forEach ()

Таким образом, ответ отправляется до того, как он завершится.Вам нужно будет использовать что-то вроде

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array);
  }
}

app.get("/api/venues/", (req, res, next) => {
  const query = datastore
  .createQuery('venue');

    query.run().then(async ([venuesList]) => {
      await asyncForEach(venuesList, async(venue) => {
        startDate = moment(new Date()).format('L');
        endDate = moment(new Date()).startOf('week').format('L');
        const queryVenueInvoice = datastore
          .createQuery('invoices')
          .filter('targetacntkey', '=', venue.userid);

        // child query run here
        await queryVenueInvoice.run().then(([invoicesList]) => {...

Также я бы поместил res.status (200) ... внутри query.run (). Then (... и вне asyncForEach (... надеюсь это поможет

...