【问题标题】:How to trigger onCreate in Firestore cloud functions shell without using an existing document如何在不使用现有文档的情况下在 Firestore 云函数 shell 中触发 onCreate
【发布时间】:2018-05-01 00:11:21
【问题描述】:

我正在使用 firebase-tools shell CLI 来测试 Firestore 云功能。

我的函数使用通配符响应特定集合中所有文档的 onCreate 触发器,然后使用更新调用改变该文档。

firestore
    .document(`myCollection/{documentId}`)
    .onCreate(event => {
      const ref = event.data.ref
      return ref.update({ some: "mutation"})
    })

在 shell 中我运行类似这样的东西,(传递一些我的数据库权限所需的假身份验证数据):

myFunction({some: "data"}, { auth: { variable: { uid: "jj5BpbX2PxU7fQn87z10d4Ks6oA3" } } } )

但是这会导致错误,因为更新会尝试改变不在数据库中的文档。

错误:没有要更新的实体

documentation about unit testing 中解释了如何为 event.data 创建模拟,以便在不接触实际数据库的情况下执行函数。

但是我试图调用一个真正的函数,该函数应该对数据库进行操作。模拟是没有意义的,否则这只不过是一个单元测试。

我想知道调用这样的函数的策略应该是什么?

通过使用文档的现有 id,该函数可以成功执行,但这似乎很麻烦,因为您需要在每次测试的数据库中查找它,并且在某些时候它可能不再存在。

我认为,如果 shell 能够以某种方式从您传入的数据创建一个新文档,并从中运行触发器,那将非常有帮助。这可能是可能的,还是有其他方法?

【问题讨论】:

标签: firebase google-cloud-functions google-cloud-firestore


【解决方案1】:

Cloud Functions 模拟器只能模拟可能在您的项目中发生的事件。它不会模拟触发它的数据库的实际更改。

正如您所发现的,当您的功能依赖于先前发生的实际更改时,您可能会遇到问题。事实是,在您处理函数中的事件时,创建的文档完全有可能已经被删除(想象一下用户迅速采取行动删除,但无论出于何种原因,该事件被延迟)。

说了这么多,也许您想将set() 与表示您要合并而不是覆盖的 SetOptions 一起使用。请记住,如果文档在事件触发之前已被删除(有充分理由),您将无条件地重新创建文档,这可能不是用户想要的。

【讨论】:

  • 是的,这是有道理的。我希望 shell 能够提供一种基于您传入的参数创建新文档的方法。对于测试 onCreate 处理程序,我认为这会有所帮助,但也许我应该用单元测试来涵盖这种测试,或者创建特殊的我知道我的数据库中的测试文档不会消失。我的大多数云函数都响应 onCreate 事件,所以我担心 shell 不是一种方便的测试方法。
猜你喜欢
  • 2019-06-27
  • 2020-08-08
  • 1970-01-01
  • 2019-02-13
  • 2018-07-21
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多