NodeJS 云函数被重复调用

p5cysglq  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(160)

Firestore云函数会调用自己吗?我正在尝试实现下面的过程,而不会成为递归函数。云函数只被调用一次。
过程:
1:用户从客户端更新文档。
2:云函数被调用,抓住一些用户并更新他们的文档。
由于两个更新(在客户端和云函数上)使用相同的更新路径,因此该函数似乎被调用了3次(当我console.log该过程时)。这是预期的行为吗?如何安全地调用函数一次而不冒被多次调用的风险?

exports.onUpdateEvent = functions.firestore
  .document("all_artists/{userId}")
  .onUpdate(async (change, context) => {
    const updateData = change.after.data();

    const artistFollowersRef = admin.firestore().collection("artistFollowers");
    const querySnapshot = await artistFollowersRef.get();

    querySnapshot.forEach((doc) => {
      const userId = doc.id;
      admin
        .firestore()
        .collection("all_artists")
        .doc(userId)
        .update(updateData);
    });
  });
pb3skfrl

pb3skfrl1#

如果Cloud Functions代码写入触发它的文档,那么确实会导致它再次被调用。除非你对此加以防范,否则将导致一个无限循环。
每当更新任何用户文档时,都会触发您的函数,并且它会更新同一集合中的所有用户文档。这意味着您不能通过在触发器中使用不同的路径来阻止调用。
我不完全确定你的函数试图完成什么,但防止进一步调用的一种常见方法是在数据中包含一个标志值。例如,如果更改写入的数据:

updateData.preventFurtherTriggers = true;

然后,您可以在获取数据后立即检查该标志,并提前退出:

exports.onUpdateEvent = functions.firestore
  .document("all_artists/{userId}")
  .onUpdate(async (change, context) => {
    const updateData = change.after.data();
    if (updateData.preventFurtherTriggers === true) return; // 👈

    ...

顺便说一下,你的函数当前没有正确地返回一个Promise来表示它正在执行异步操作。您需要阅读sync, async, and promises的文档,并观看其中的视频,以了解如何解决这个问题。

相关问题