【问题标题】:How to write back end server code in Firebase如何在 Firebase 中编写后端服务器代码
【发布时间】:2017-11-11 12:37:03
【问题描述】:

我正在学习 Firebase。我已经学会了如何读取和写入 Firebase 实时数据库以及如何为该数据库制定规则。我也读过 Cloud Functions。

但我仍然对如何编写在 Firebase 实时数据库上应用某些算法并将其返回到我的 Android 应用程序的服务器端代码感到困惑。

【问题讨论】:

  • 您能否为我们提供一些您希望在 Cloud Functions 中执行以返回到您的应用程序的函数/算法的示例?这样我们也可以编写一些示例代码。
  • @Grimthorr 例如,每两分钟调用一些函数并修改数据库中的一些数据。而且我还想知道如何在数据库中实现外键约束。我见过很多事情,比如非规范化和使用查询对其进行测试。但我只想检索客户端所需的信息,而不是全部。

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


【解决方案1】:

云函数

使用Cloud Functions for Firebase,您可以自动运行后端代码以响应由 Firebase 功能和 HTTPS 请求触发的事件。

如果您需要一个函数在调用时对数据库执行工作,您可以配置一个HTTP trigger 来执行此操作。例如,下面的云函数从数据库中读取最后存储的数字(存储在/lastNumber),将其加1(一),将其保存回数据库,然后返回当前值:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.nextNumber = functions.https.onRequest((req, res) => {
    var ref = admin.database().ref('/lastNumber');
    ref.transaction(function(current) {
      return (current || 0) + 1;
    }, function(error, committed, snapshot) {
      var currentNumber = snapshot.val().toString();
      console.log("Generated number: ", currentNumber);
      res.status(200).send(currentNumber);
    });
});

一旦deployed to Cloud Functions,您只需访问它的HTTPS端点即可调用此函数(其中<region>是您的地区,<project-id>是您的项目ID):

https://<region>-<project-id>.cloudfunctions.net/nextNumber

Firebase Functions Samples repository 上还有大量其他示例可供您浏览和使用。


实时数据库

Firebase 实时数据库称为NoSQL,这意味着没有直接关系或外键约束,因此建议您在存储数据时使用denormalization 的过程。

文档详细介绍了best practices for structuring your data,最重要的是避免嵌套数据,而是尽可能地使用flatten data structures 创建可扩展的数据。

这里的基本前提是,当您只需要获取选定数量的项目时,您希望避免从数据库中下载所有数据,但同样具有将项目链接在一起的能力,就像在关系数据库中一样。来自documentation on data fanout

例如,考虑用户和组之间的双向关系。用户可以属于一个组,而组包含一个用户列表。当需要决定用户所属的组时,事情就变得复杂了。

需要一种优雅的方式来列出用户所属的组并仅获取这些组的数据。组索引在这里可以提供很大帮助:

// An index to track Ada's memberships
{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      // Index Ada's groups in her profile
      "groups": {
         // the value here doesn't matter, just that the key exists
         "techpioneers": true,
         "womentechmakers": true
      }
    },
    ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true,
        "eclarke": true
      }
    },
    ...
  }
}

复制数据并使用此类索引是此类数据库的建议模式。这就是为什么有可用的函数允许您执行多位置写入以简化非规范化过程。

例如在Android中,使用上述数据库结构,您可以轻松插入一个新用户(用户名为testuser)并将其添加到techpioneersin a single operation

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
HashMap<String, Object> data = new HashMap<>();

// Build the new data using location paths
data.put("/users/testuser/name", "Test User");
data.put("/users/testuser/groups/techpioneers", true)
data.put("/groups/techpioneers/members/testuser", true);

// Save this new data all at once
database.updateChildren(data);

Firebase 已发布多个samples, examples and code labs to help you get started

【讨论】:

【解决方案2】:

Firebase 本质上是无服务器的,这意味着应用程序的所有逻辑都应包含在客户端中。

但是,如果您认为服务器端逻辑对您的应用来说是必不可少的,您可以通过以下方式扩展其功能:

1) 云功能。例如您从客户端应用程序上传图片,然后触发云功能以调整图片大小。

2) 使用谷歌云平台基础设施。

3) 通过在您自己的服务器上使用 firebase admin-sdk 并创建 node.js 后端。

您可以查看here 以获取有关 firebase 使用的许多有用示例,this 信息将帮助您了解更多需要遵循的架构,具体取决于您要构建的应用程序。

【讨论】:

  • 我想在我们的 Firebase 数据库 json 中实现 SQL 外键约束。
  • 您已经知道 firebase 是一个 nosql 数据库,因此您需要对数据进行非规范化。我建议观看来自 David East 的一些非常有用的广播,例如 youtu.be/WacqhiI-g_o 并参考 firebase 博客! firebase.googleblog.com/2013/04/… 也关注文章中提供的更新链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2014-08-20
  • 1970-01-01
  • 2016-09-28
  • 2017-02-11
  • 2011-03-14
  • 2016-02-25
相关资源
最近更新 更多