reactjs - 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);
});
我不确定我在这里做错了什么。
干杯!
解决方案
没有办法在 orderByChild 中执行多个项目,NoSQL 中的非规范化很好,就像你提到的那样保持同步。我建议使用云功能,它可以帮助您保持同步。
另一种选择是使用 Firestore 而不是实时数据库,因为它具有更好的查询功能,您可以在其中将用户 ID 存储在文档中,并使用包含过滤器的数组来获取所有用户的帖子。
下面是用于更新项目的实时数据库触发器的云函数的开始。
exports.itemUpdate = functions.database.ref('/items/{itemId}')
.onUpdate((snap, context) => {
// Query your users node for matching items and update them
});
推荐阅读
- python - 如何在python中生成所有具有固定长度的四位数字的序列号?
- azure-storage - 仅当 Blob 完全提交时才发生 BlobCreated 事件
- r - 基于多列重塑数据集
- rest - 无法使用标头感染 api
- three.js - Three.js 网格的天使调整
- java - 调用 onBackPressed ViewGroup 后不可见
- pine-script - 为今天和昨天扩展框
- spring-boot - Spring Boot 管理员兼容性 Spring Boot 版本和日志记录实例
- spring - 如果抛出运行时异常,然后在用spring的@Transactional注解的方法中捕获,导致事务回滚?
- css - 如何配置 webpack 或 nextjs 以从材料自定义样式创建 css 文件,然后将其注入 header