因此,我正在使用 flutter 和 firebase 构建一个聊天应用程序,每当两个新用户第一次开始互相聊天时(每当其中一个用户发送第一条消息时),我需要触发一个功能,这样我就可以将该信息存储在某处以显示稍后将其作为聊天记录提供给用户(曾经接触过的人)。
所以我的数据树看起来像这样:'rooms/{roomId}/messages/{messageWithRandomId}'
从逻辑上讲,每当用户向另一个用户发送第一条消息时,都会创建房间文档以及包含带有 randomId 的单个消息文档的子集合“messages”。
`
我已经在房间的集合上设置了一个 OnCreate 侦听器,每当我在“房间”下手动创建新文档时,它就会被触发。
但当子集合创建同一文档时,它不会被触发。
所以我的代码如下所示:
export const testfunction = functions.firestore.document('rooms/{_someRoom}').onCreate(async (snapshot,context) => {
// the function Core
}
当相同的文档被创建时它不会被触发
子集合。
这是正常行为。
事实上,如果您直接在messages
具有完整路径的集合rooms/{roomId}/messages/{messageWithRandomId}
, 不会创建任何中间文档(即没有roomId
文档)。
所以,当你说:
the room
文档与子集合一起创建messages
包含单个消息文档randomId
,如果您仅使用以下内容创建消息文档randomId
, 实际上没有room
文档已创建,因此未触发云功能.
Firebase 控制台以斜体显示roomId
房间“文档”作为一种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到messageWithRandomId
消息文档,但 Firestore 数据库中不存在该房间文档。
让我们举一个更通用的例子:想象一下doc1
下的文件col1
收藏
col1/doc1/
以及 subCol1(子)集合下的另一个 subDoc1
col1/doc1/subCol1/subDoc1
实际上,从技术角度来看,它们彼此之间根本没有关系。他们只是分享自己道路的一部分,除此之外别无其他。这样做的一个副作用是,如果您删除文档,其子集合仍然存在。
这意味着您应该:
为自己创造roomId
下的文件rooms
收藏
OR
通过以下方式触发您的云功能:
export const testfunction = functions.firestore.document('rooms/{_someRoom}/messages/{_someMessage}').onCreate(async (snapshot,context) => {
//.....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)