由子文档或集合完成创建后,不会触发firestore OnCreate

时间:2019-06-25 20:03:55

标签: node.js typescript firebase google-cloud-firestore google-cloud-functions

因此,我正在使用Flutter和Firebase构建一个聊天应用程序,每当两个新用户首次开始彼此聊天时(无论他们何时发送第一条消息),我都需要触发一个功能,以便我可以存储该信息稍后再将其显示为用户的聊天记录(已联系的人)的地方。

所以我的数据树看起来像这样:'rooms / {roomId} / messages / {messageWithRandomId}'

从逻辑上讲,每当用户向其他用户发送第一条消息时,就会创建会议室文件以及包含单个消息文档(带有randomId)的子集合“消息”。 `

我已经在会议室的集合上设置了一个OnCreate侦听器,每当我在“会议室”下手动创建新文档时就会触发它。

但是当子集合创建相同的文档时,不会触发该事件。

所以我的代码如下:

export const testfunction = functions.firestore.document('rooms/{_someRoom}').onCreate(async (snapshot,context) => {

// the function Core
 }

1 个答案:

答案 0 :(得分:2)

  

当文档创建相同的文档时不会触发   子集合。

这是正常现象。

事实上,如果您直接在messages集合下使用完整路径rooms/{roomId}/messages/{messageWithRandomId}创建文档,则将不会创建任何中间文档(即不会创建{ {1}}文档。

所以,当你说:

  

roomId文档与子集合一起创建   room包含带有messages

的单个邮件文档

,如果仅使用randomId创建了消息文档,则实际上没有创建randomId文档,因此不会触发云功能。 >

Firebase控制台以斜体形式将room会议室“文档”显示为一种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到{ {1}}消息文档,但会议室文档在Firestore数据库中不存在。


让我们举一个更通用的示例:想象一个roomId集合下的messageWithRandomId文档

doc1

和subCol1(子)集合下的另一个subDoc1

col1

实际上,从技术的角度来看,它们根本不是相互关联的。它们只是共享其路径的一部分而已。这样做的副作用是,如果删除文档,则其子集合仍然存在。


这意味着您应该:

col1/doc1/ 集合下创建col1/doc1/subCol1/subDoc1 文档

OR

通过以下方式触发您的云功能:

roomId