kag*_*ker 2 node.js firebase typescript google-cloud-functions google-cloud-firestore
所以我正在使用 flutter 和 firebase 构建一个聊天应用程序,每当两个新用户第一次开始互相聊天时(当他们中的一个发送第一条消息时)我需要触发一个函数,这样我就可以将该信息存储在某个地方以显示稍后它作为聊天记录(已接触过的人)提供给用户。
所以我的数据树看起来像这样:'rooms/{roomId}/messages/{messageWithRandomId}'
从逻辑上讲,每当用户向另一个用户发送第一条消息时,房间文档就会与包含带有 randomId 的单个消息文档的子集合“消息”一起创建。`
我已经在房间的集合上设置了一个 OnCreate 侦听器,每当我在“房间”下手动创建一个新文档时,它就会被触发。
但是当子集合创建同一个文档时它不会被触发。
所以我的代码如下所示:
export const testfunction = functions.firestore.document('rooms/{_someRoom}').onCreate(async (snapshot,context) => {
// the function Core
}
Run Code Online (Sandbox Code Playgroud)
当子集合创建同一个文档时,它不会被触发。
这是正常行为。
作为事实上,如果你直接创建文档的下messages集的完整路径rooms/{roomId}/messages/{messageWithRandomId},没有中间文件将被创建(即无roomId文件)。
所以,当你说:
该
room文档与messages包含单个消息文档的子集合一起创建randomId
,如果您只创建了带有 的消息文档randomId,则实际上没有room创建文档,因此不会触发 Cloud Functions 函数。
Firebase 控制台以斜体显示roomId房间“文档”作为一种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到messageWithRandomId消息文档,但房间文档没有t 存在于 Firestore 数据库中。
让我们举一个更通用的例子:想象一下集合doc1下的一个文档col1
col1/doc1/
Run Code Online (Sandbox Code Playgroud)
和 subCol1 (sub-) 集合下的另一个 subDoc1
col1/doc1/subCol1/subDoc1
Run Code Online (Sandbox Code Playgroud)
实际上,从技术角度来看,它们之间根本没有联系。他们只是分享他们路径的一部分,但没有其他任何内容。这样做的一个副作用是,如果您删除一个文档,它的子集合仍然存在。
这意味着您应该:
roomId在rooms集合下创建自己的文档
或者
通过以下方式触发您的云功能:
export const testfunction = functions.firestore.document('rooms/{_someRoom}/messages/{_someMessage}').onCreate(async (snapshot,context) => {
//.....
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |