【问题标题】:Understanding the Firebase and purpose of google cloud functions了解 Google Cloud 功能的 Firebase 和用途
【发布时间】:2018-07-01 10:07:59
【问题描述】:

假设我正在开发像 Instagram 这样的应用程序:适用于 iOS、Android 和 Web。我决定使用 Google Firebase,因为它看起来确实可以简化工作。

用户在应用中需要的功能有:

  • 授权/注册
  • 上传照片
  • 搜索其他人、关注他们并查看他们的照片

我来自传统的“自己的后端”开发,我确实需要设置服务器、创建数据库并最后编写 API 让前端从服务器检索数据。这就是为什么我不清楚它在 Firebase 中是如何工作的。

所以问题是如何创建这样的应用程序:

  1. 我应该使用云函数创建自己的 API 吗?还是可以直接从客户端使用数据库?
  2. 如果我直接使用数据库,为什么需要云功能?我应该使用它们吗?

很抱歉提出这么愚蠢的问题,但从头开始真的很难。

【问题讨论】:

  • 您的问题过于宽泛,无法具体而明确地回答。如果您正在寻找对话以帮助确定 Cloud Functions 是否适合您的特定用例(您在此处并未真正提及),请尝试发布到 firebase-talk。 groups.google.com/forum/#!forum/firebase-talk
  • 阅读 Firebase 入门指南并编写一些代码可以回答您的很多问题。制作一个非常基本的应用程序来上传照片并写入一些用户数据将是一个非常值得的产品测试,如果它符合您的用例,会给您更好的感觉。

标签: firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

Firebase 与您描述的传统设置之间的主要区别在于,使用 Firebase,就应用开发者而言,客户端可以直接访问数据库,而无需中间的自定义 API 层。 Firebase 提供各种语言的 SDK,您通常会使用这些 SDK 来获取所需的数据/提交数据更新。

您还拥有可以在服务器端使用的管理 SDK,但这些 SDK 是为了让您运行一些自定义业务逻辑 - 例如分析、在外部服务中缓存 - 而不是让您实现数据提取API 层。

这有两个重要的后果:

  1. 您必须定义安全规则以控制允许谁在数据库中的哪些路径上读/写。这些安全规则是在项目级别定义的,并且依赖于经过身份验证的用户(使用 Firebase 身份验证)。通常,如果您将用户配置文件存储在路径 users/$userId 中,您将定义一条规则,说明只有经过身份验证的用户的 id 为 $userId,才能写入此节点。
  2. 您必须以易于阅读的方式构建数据 - 无需复杂的数据库操作,例如 Firebase 不支持的 JOIN(您确实有一些有限的查询选项很难)。

这两点让您可以跳过传统 API 的 2 个主要角色:验证访问和获取/格式化数据。

云功能可让您对数据更改做出反应。假设每次创建新用户时,您都想向他发送一封欢迎电子邮件:您可以定义一个云函数,每次将新节点附加到 users 路径时发送此电子邮件。它们允许您运行通常在写入发生时在服务器端运行的代码,因此它们可以有非常广泛的用例:副作用(例如发送电子邮件)、在外部服务中缓存数据、缓存Firebase 中的数据,以便于读取、分析等。

【讨论】:

  • 与我的答案相比,您的答案写得多么好,我感到很谦卑。 =)
【解决方案2】:
  1. 您实际上并不需要服务器,您可以直接从客户端访问数据库,只要您的用户经过身份验证并且您在 Firebase 上定义了合理的安全规则。

  2. 在您的使用案例中,例如,您可以使用云函数在有人上传照片时创建缩略图(Firebase Cloud Functions 包含了 ImageMagick),或者对您的数据进行非规范化以使您的应用程序更快,或生成日志。因此,基本上,当您的数据库或存储发生更改时,您可以在需要进行一些服务器端处理时使用它们。但我发现云功能很难开发和调试,还有一些替代方案,例如创建一个 Node 应用程序,它可以订阅数据的实时变化并对其进行处理。缺点是您需要将其托管在 Firebase 之外。

【讨论】:

    【解决方案3】:

    我的回答肯定完整或专业,但这里是我选择Cloud Functions的原因

    性能

    您提到您正在编写一个类似 instagram 的移动设备应用程序,那么我假设人们可以评论其他人的图片,以及查看这些 cmets。您想如何从数据库中下载 cmets 并将其显示在用户的设备上?我的意思是,一篇文章中可能有数百甚至数千个 cmets,您需要对结果进行分页。为什么不让服务器完成所有繁重的工作,释放用户的设备并等待结果呢?这似乎并没有好多少,但让我们面对现实吧,如果你的应用程序非常成功,你将拥有数百万用户,数百万你需要处理的 cmets,服务器将比服务器更好地完成这些艰巨的工作手机。

    安全

    如果您的项目很小,那么您确实不会担心性能问题,但安全性呢?如果你在客户端做所有事情,你基本上允许每台设备连接到你的数据库,这意味着每台设备都可以读取/写入你的数据库。一旦恶意用户发现了您的数据库 url,他所要做的就是

    firebase.database().ref(...).remove();
    

    使用 1 行代码,您将丢失所有数据。好吧,如果你这么说,那我就想出一些好的安全规则,如下所示:

    这意味着对于每个帖子,只有该帖子的所有者可以对其进行任何更改或阅读,禁止其他人做任何事情。这很好,但不现实。人们应该能够对帖子发表评论,即修改帖子,此规则不适用于这种情况。但是再一次,如果你让每个人都读/写,那又不安全了。那么,为什么不把.read.write 设为false,像这样:

    它是 100% 安全的,因为没有人可以对您数据库中的任何事情做任何事情。然后,您编写一个 API 来对数据库执行所有操作。 API 限制了可以对您的数据库执行的操作。而且您有编写 API 的经验,我相信您可以做一些事情来使您的 API 在安全性方面强大,例如,如果用户想要删除他在您的 deletePost API 中创建的帖子,您re 应该首先对用户进行身份验证。这样,“nobody”就不会对您的数据库造成任何损害。

    【讨论】:

    • 我真的很喜欢你的回答。谢谢你。但感觉就像 Firebase 团队说:“嘿,伙计们,这是一件很酷且简单的事情”,而我们就像“不,让我们按照传统方式做事”。这样做时我们不会失去 Firebase 的好处吗?没事吧?
    • 没错,除非你能想出一些好的安全规则,但这总是有漏洞的。我喜欢 firebase 的另一件事是,您无需刷新即可获得最新结果。在我的项目中,我只允许用户直接从users 表中读取,该表存储了他们的信息。如果他们更改了用户名或个人资料图片 url,他们不必刷新应用程序即可看到更改,相反,所有信息都会自动更新,这也为我节省了很多工作。我对users 表的安全规则是:"users": {"$uid": {".read": "$uid === auth.uid", ".write": false}}
    • 那么,他的回答是对的,我不应该实现 API 层吗?
    • @NikitaMarinosyan 如果您要完成的工作不是繁重的工作,同时又不会给任何人太多特权,那么您就不必为它编写 API .就我而言,我让用户阅读他自己的信息,这并不重,他所能做的就是阅读他自己的信息,正如安全规则所定义的那样,那很好,我不明白为什么不跨度>
    • 谢谢你,伙计!我希望我可以将您的答案标记为解决方案:C
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 2018-06-30
    • 2018-10-04
    • 2021-09-14
    • 2020-12-23
    • 2012-01-17
    相关资源
    最近更新 更多