【问题标题】:How can I return and parse document returned from the Firebase server to the client?如何返回和解析从 Firebase 服务器返回给客户端的文档?
【发布时间】:2020-08-27 08:09:49
【问题描述】:

前言:我是一名深入研究 Node/JS 的 iOS 程序员。我创建了一个https.onCall 函数,因为我需要执行多次读取+写入。在最终的更新承诺中,理想情况下,我希望以可以解码为DocumentSnapshot 的形式返回数据(因为这很容易转换为模型),但我很乐意做最佳实践也是。

这是相关代码的样子:

return group.ref.set({
  members: admin.firestore.FieldValue.arrayUnion(user)
}, { merge: true }).then(result => {
   // The additional `get` seems necessary because the completion block doesn't contain the updated document's data
   return group.ref.get().then(doc => {
     return doc
  })
})

我也尝试返回return group.ref.get(),但都未能在iOS端解析:

// This fails to cast
guard let document = result?.data as? DocumentSnapshot else { return }

我在想这是我可以做的另一种选择:

...
return {
  id: doc.id,
  data: doc.data()
}

然后在iOS端手动解码JSON。但这感觉很沉重,所以我希望有人能用更直接的解决方案来启发我。

【问题讨论】:

    标签: javascript ios firebase google-cloud-functions


    【解决方案1】:

    可调用函数不接收或传递强类型数据。一切都归结为 JSON,它在两端都转换为相关的低级类型。

    如果您想从可调用函数传递 DocumentSnapshot,则应至少调用其 data() 方法以获取易于序列化的纯 JavaScript 对象,这正是您的替代方法所做的。就个人而言,我不认为这是“重手”。这是不共享复杂类型序列化系统的系统之间非常典型的数据交换。

    【讨论】:

    • 谢谢,我需要验证这是正确的方法。重手:考虑到有一些方法可以获取具有给定引用的文档,并使用所述文档轻松初始化您自己的自定义对象,我很好奇是否有办法挂钩这些解码方法。最坏的情况是,我可以查看源代码并在我的 http 请求周围实现一个包装器。感谢您的快速回复!
    • 为了后代,我确实找到了一个 Firebase 方法来解码可以重用的对象:Firestore.Decoder().decode(Model.self, from: data)
    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多