云功能脚本在所有uid上写入

时间:2019-06-15 11:24:55

标签: node.js google-cloud-platform google-cloud-firestore google-cloud-functions

我遇到一个问题,即我的Cloud Function脚本检测到Firestore数据库中特定用户的写入更改。 这个想法是,在触发写入更改时,我会为该用户计算一个新的总值,即,当从本地用户处写入新的步行距离时,我会在云函数上计算一个新的总距离。不幸的是,这似乎是因为我的脚本检测到正确的更改,但随后为数据库中的所有uid /文档写入了新值。我只想更新检测到更改的用户的字段。我在这里做错了什么? 我检查uid值是更改已注册的实际用户ID,这是因为调试后我在控制台日志中进行了检查。

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 :(得分:0)

请参阅:

  

如果您不关心触发的事件的类型,则可以使用带通配符的onWrite()函数来侦听Cloud Firestore文档中的所有更改。如果创建,更新,或删除:

     

每个函数调用都与Cloud Firestore数据库中的特定文档相关联。您可以在返回给函数的快照的ref属性中将该文档作为DocumentReference进行访问。

注意!!!

  

注意:每当您写入触发功能的同一文档时,都有创建无限循环的风险。请谨慎操作,并确保在不需要更改时安全退出该功能。

如果发生无限循环,则应在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
    });
  });