#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()
. Все еще не работает, хотя