Https-запрос на обновление данных в массиве

#javascript #typescript #firebase #google-cloud-firestore

#javascript #typescript #firebase #google-облако-firestore

Вопрос:

Я ранее задавал вопросы по этому вопросу и все еще немного застрял. Я пытаюсь решить следующее: — Всякий раз, когда добавляется документ, его необходимо обновлять через некоторое время (2 часа)

В настоящее время я решаю эту проблему следующим образом: — Я создаю временную метку при создании документа с помощью onCreate — Я добавляю документ в массив — У меня есть еще одна функция https, которая запускается каждые 1 минуту (как задание cron), которая проверяет элементы в массиве и сравнивает текущую временную метку с отметкой временидокумента (который является переменной в базе данных)

Код, который у меня есть, следующий:

    const array = []

   export const onTimerCreate = functions.firestore
   .document(`Message/{UserId}/{ChatRoomId}/{UserId_1}`)
   .onCreate((snapshot, context) => {
     const timestamp = admin.firestore.Timestamp.now().seconds
     array.push(snapshot)
     return snapshot.ref.update({ creationTime: timestamp})

   })

   export const testDelay = functions.https.onRequest((request,               response) => {
     const timestamp = admin.firestore.Timestamp.now().seconds
     array.forEach( snapshot => {
       const data = snapshot.data()
       const time = data.creationTime
       const delay = (data.delay) / 1000
       const actualTime = time   delay
       console.log(array)
       if (actualTime > timestamp) {
         return snapshot.ref.update({ delay : 0})
       }
     })
   })
  

Однако проблема в том, что сейчас время ожидания запроса истекает через 60 секунд. Я думаю, что происходит то, что я неправильно добавляю документ, поскольку массив, в который я добавляю данные с помощью первой функции, не содержит данных. Однако я не уверен, как это исправить. Помощь будет оценена.

Ответ №1:

Ваша функция testDelay всегда будет отключена, потому что она никогда не отправляет ответ клиенту. Согласно документации:

Завершите HTTP-функции с помощью res.redirect(), res.send() или res.end() .

Если вы не вызовете один из этих методов для объекта ответа, облачные функции не завершат вашу функцию, и время ожидания истечет.

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

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

1. Однако правильно ли обновляются элементы в массиве? Даже если это из двух разных функций? Например, при создании документа он загружается в массив, а затем массив считывается из функции http через снимок?

2. Это то, что вы могли бы сказать, просмотрев документ, верно?

3. Я добавил это в оператор if: response.send(snapshot.ref.update({ delay : 0})) и я добавил оператор else, говорящий response.end() . Все еще не работает, хотя