如何在Firebase中写回最终服务器代码

时间:2017-11-11 12:37:03

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

我正在学习Firebase。我学会了如何阅读&写入Firebase实时数据库以及如何为该数据库制定规则。我还读过有关云功能的内容。

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

2 个答案:

答案 0 :(得分:1)

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

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

1)云功能。例如您从客户端应用程序上传图片,并启动云功能以调整图片大小。

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

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

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

答案 1 :(得分:1)

云功能

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

如果在调用时需要一个函数来对数据库执行操作,则可以配置HTTP trigger来执行此操作。例如,下面的Cloud Function从数据库中读取最后存储的数字(存储在/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>是您所在的地区&amp; <project-id>是您的项目ID):

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

Firebase Functions Samples repository上有许多其他示例可供您浏览&amp;使用

实时数据库

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