我正在尝试使用Firebase实时数据库触发器设置Google Cloud函数,但在向数据库添加文档时无法触发该函数。
我希望的是,当项目xxx下的Firebase数据库集合yyy中有一个新条目时,我希望触发Cloud Function函数-1。函数-1是默认值(如下所示(,测试运行良好。
我正在使用主控制台,并创建了一个名为function-1的函数。我可以在firebase控制台中看到功能本身:
https://console.firebase.google.com/u/0/project/xxx/functions/list
我设置的集合在xxx项目下,名为yyy,我可以在下访问它
https://console.firebase.google.com/u/0/project/xxx/database/firestore/data~2Fyyy
我在功能控制台:
https://console.cloud.google.com/functions/edit/us-central1/function-1?project=xxx
设置如下:
- 触发器:Firebase实时数据库(Beta(
- 事件类型:创建
- 数据库:xxx
- 路径:/data/yyy
Runtime是Python 3.7
代码是默认的谷歌云功能代码:
def hello_rtdb(event, context):
"""Triggered by a change to a Firebase RTDB reference.
Args:
event (dict): Event payload.
context (google.cloud.functions.Context): Metadata for the event.
"""
resource_string = context.resource
# print out the resource string that triggered the function
print(f"Function triggered by change to: {resource_string}.")
# now print out the entire event object
print(str(event))
requirements.txt为空
我在其他谷歌云函数中成功地使用了其他触发器(HTTP或PubSub(,但我无法通过数据库事件触发该函数。我已经为路径变量尝试了很多选项,但无法使其工作。
我为路径变量尝试的选项是:
- /xxx/database/firestore/data/yyy
- /数据库/firestore/data/yyy
- /数据/yyy
- /yyy
- yyy等等
我确信我犯了一个基本的错误,但遗憾的是,文档没有帮助(可能是因为这是一件非常基本的事情(。如何以正确的方式设置?
您使用的是Google Firestore还是Firebase Firestore?我知道他们在技术上是一样的产品被掩盖,但我相信它们会引发不同的事件。这可能取决于您从Google Cloud Platform或Firebase创建了数据库。
$ gcloud functions event-types list
EVENT_PROVIDER EVENT_TYPE EVENT_TYPE_DEFAULT RESOURCE_TYPE RESOURCE_OPTIONAL
google.firebase.database.ref providers/google.firebase.database/eventTypes/ref.write Yes firebase database No
google.firestore.document providers/cloud.firestore/eventTypes/document.write Yes firestore document No
我正在使用event_provider=google.firestore.dococument,它很有效。以下是我如何将Python函数部署到Google Cloud上。假设main.py
与您的上述代码一起存在,但函数名称为hello_firestore
。
$ gcloud functions deploy hello_firestore --entry-point hello_firestore --runtime python37 --trigger-event providers/cloud.firestore/eventTypes/document.write --trigger-resource "projects/$GCP_PROJECT/databases/(default)/documents/$DOC_PATH"
对于Firebase Firestore,它应该是这样的,但这并没有经过测试,因为我是从GCP而不是Firebase创建Firestore的。
$ gcloud functions deploy hello_rtdb --entry-point hello_rtdb --runtime python37 --trigger-event providers/google.firebase.database/eventTypes/ref.write --trigger-resource "projects/_/instances/$GCP_PROJECT/refs/$DOC_PATH"
另一件需要注意的事情是,只有Firestore本机模式支持触发事件,如限制和保证一节中所述。