Cloud Function Script записывает все идентификаторы пользователей - PullRequest
0 голосов
/ 15 июня 2019

У меня проблема с тем, что мой скрипт Cloud Function обнаруживает изменение записи от определенного пользователя в базе данных Firestore. Идея состоит в том, что при инициированном изменении записи я вычисляю новое общее значение для этого пользователя, т.е. когда новое локальное расстояние записывается, я вычисляю новое общее расстояние для облачных функций. К сожалению, похоже, что мой скрипт обнаруживает изменение правильно, но затем записывает новые значения для ВСЕХ uid / документов в базе данных. Я только хочу обновить поля пользователя, для которого было обнаружено изменение. Что я здесь не так делаю? Я проверил, что значение uid является фактическим идентификатором пользователя, на котором было зарегистрировано изменение, потому что я проверил в журнале консоли после отладки.

module.exports.LogSummary = functions.firestore
.document('Logs/{userId}').onWrite((change, context) => {
  const uid = context.params.userId;

  let TotalDistance = 0;
  TotalDistance = 
    change.after.data().Running_Distance + 
    change.after.data().Walking_Distance;

  return db
    .collection('Logs')
    .doc(uid)
    .update({
      Total_Distance_Cloud: TotalDistance})
    .catch(console.error);
});

1 Ответ

0 голосов
/ 15 июня 2019

См:

Если вас не интересует тип запускаемого события, вы можете прослушать все изменения в документе Cloud Firestore, используя функцию onWrite () с подстановочным знаком. В этом примере функция вызывает modifyUser, если пользователь создан, обновлен, или удалено:

Каждый вызов функции связан с конкретным документом в вашей базе данных Cloud Firestore. Вы можете получить доступ к этому документу как DocumentReference в свойстве ref снимка, возвращенного вашей функции.

Внимание !!!

Примечание. Каждый раз, когда вы пишете в тот же документ, который вызвал функцию, вы рискуете создать бесконечный цикл. Будьте осторожны и убедитесь, что вы безопасно выходите из функции, когда не требуется никаких изменений.

Если возникли бесконечные циклы, вам следует удалить функцию облака в облачной консоли Google.

Установите флажок для бесконечных циклов и попробуйте следующий код.

module.exports.LogSummary = functions.firestore
  .document("Logs/{userId}")
  .onWrite((change, context) => {
    // If the document does not exist, it has been deleted.
    if (!change.after.exists) {
      return;
    }
    // Retrieve the current value
    const data = change.after.data();
    const totalDistance = data.Running_Distance + data.Walking_Distance;

    // This is crucial to prevent infinite loops.
    if (data.Total_Distance_Cloud === totalDistance) {
      return;
    }

    // Then return a promise of a set operation to update
    return change.after.ref.update({
      Total_Distance_Cloud: totalDistance
    });
  });
...