首页 > 解决方案 > Firebase 云功能不更新记录

问题描述

想象一下这种情况:

您有一个包含 100 个项目的列表,用户收藏了列表中的 12 个项目。

用户现在希望这 12 个项目显示在具有最新数据的新列表中(如果数据从原始列表/节点发生更改)

在不必对每个项目的所有数据进行非规范化的情况下,最好的方法是什么?

有没有办法 orderByChild().equalTo( multiple items )

多个项目为收藏项目)

目前,我已成功在新列表中显示收藏夹,但我将所有数据推送到带有收藏夹的用户节点,问题是当我更改数据时,他们来自收藏夹的数据不会改变。

注意 - 这些更改是在数据库中手动进行的,用户无法更改(可能会更改的元数据)


更新

我现在正在尝试使用云功能来实现这一目标。我正在尝试更新该项目,但似乎无法使其正常工作。

这是我的代码:

exports.itemUpdate = functions.database
  .ref('/items/{itemId}')
  .onUpdate((change, context) => {

  const before = change.before.val();  // DataSnapshot after the change
  const after = change.after.val();  // DataSnapshot after the change

  console.log(after);

  if (before.effects === after.effects) {
    console.log('effects didnt change')
    return null;
  }
   const ref = admin.database().ref('users')
   .orderByChild('likedItems')
   .equalTo(before.title);

   return ref.update(after);
});

我不确定我在这里做错了什么。

干杯!

标签: reactjslistfirebasefavorites

解决方案


没有办法在 orderByChild 中执行多个项目,NoSQL 中的非规范化很好,就像你提到的那样保持同步。我建议使用云功能,它可以帮助您保持同步。

另一种选择是使用 Firestore 而不是实时数据库,因为它具有更好的查询功能,您可以在其中将用户 ID 存储在文档中,并使用包含过滤器的数组来获取所有用户的帖子。

下面是用于更新项目的实时数据库触发器的云函数的开始。

exports.itemUpdate = functions.database.ref('/items/{itemId}')
    .onUpdate((snap, context) => {
        // Query your users node for matching items and update them
    });

推荐阅读