python - 基于 Firestore 更改触发云函数 (Python)
问题描述
每当 Firestore 中特定集合的任何文档中发生更改(创建、修改、删除)时,我都想捕获增量并将其发布到 pubsub。
我正在python中尝试所有这些。
代码片段:
ref = db.collection('country').document(city_id)
ref.update(body_json)
ref.on_snapshot(callback)
def callback(col_snapshot, changes, read_time):
for change in changes:
if change.type.name == 'ADDED':
print('ADDED')
elif change.type.name == 'MODIFIED':
print('MODIFIED')
elif change.type.name == 'REMOVED':
print('REMOVED')
print('end of callback')
现在,当我在 firestore 文档中进行更改时,例如:
- 添加新文档 - 我将打印作为ADDED和end of callback。
- 修改现有文档 - 我大多将打印作为ADDED但有时或者更确切地说,在 10 次运行中我得到ADDED和MODIFIED。其次是回调结束。
- 删除任何文档结束的回调。有时(很少)REMOVED和回调结束。
我无法理解这种行为,也不知道如何处理这种无法打印的执行。
解决方案
限制是这仅适用于 Node.js,因此仅适用于 Javascript。我认为它仍然适用并且值得你研究,所以尽管你的问题是基于 Python 的,但在这里分享它是最好的选择。
我认为 Cloud Functions 在这里非常适合您。您可以设置触发器,在您记下的每件事上运行函数。
添加可以由 onCreate 处理。修改后可以通过 onUpdate 处理。删除 - 由 onDelete 删除。
您基本上设置了如下所示的函数:
exports.updateUser = functions.firestore
.document('users/{userId}')
.onUpdate((change, context) => {
// Get an object representing the document
// e.g. {'name': 'Marie', 'age': 66}
const newValue = change.after.data();
// ...or the previous value before this update
const previousValue = change.before.data();
// access a particular field as you would any JS property
const name = newValue.name;
// perform desired operations ...
});
对于上面的示例,您获得了文档的前后状态,因此您不仅可以知道它已更改,还可以知道更改了什么。
示例代码直接来自此处的 Cloud Functions 文档。
推荐阅读
- mongodb - 讲解checkKeys参数呈现的mongodb注入漏洞
- vb.net - 如何验证指纹wsq格式?
- prestashop - Prestashop 1.7 - 访问整个网站上的模块
- javascript - React Hooks:在useEffect警告中获取数据
- java - Android 支持库不存在但无法编辑“Build”文件夹下的文件以引用 Android X
- laravel - 拉拉维尔。让用户使用不唯一的电子邮件登录
- reactjs - 动态“onOutsideClick”的useRef挂钩?
- xml - 如何将 XML 转换为 UTF-8 并保留标头
- r - 在 2D 平面中计算从点到点的罗盘航向
- jooq - jOOQ、Pojos 和数据库优先设计