如何为Firebase请求构建结构

时间:2018-05-17 11:13:33

标签: android firebase asynchronous callback firebase-authentication

简要信息:我正在开发Android的测验应用程序。该数据库位于Firebase上,用户通过匿名方式登录。当用户打开应用程序时,它将自动登录。

我的问题是关于firebase。我无法为firebase请求构建智能。

当应用程序打开时; 1)应首先调用signInAnonymously(哪个firebase函数)。 2)然后我检查签名用户是否在firebase数据库上有一个保存点。 3)如果用户没有点,则生成它。 4)然后我发送请求以获得用户的意见。

在所有步骤中,我通过异步firebase方法向firebase发送请求。序列很重要,因为任何步骤的输出都可以作为下一步的输入。

我通过回调来处理这个问题。但我不知道这是最好的方式。

screenshots of callbacks for these steps

你可以给我这些建议吗?如果我不使用回调,则由于异步firebase方法而出现问题。我打开这个问题的原因是未确定的问题。我可以学习并构建任何其他算法以使其更好。谢谢。

1 个答案:

答案 0 :(得分:0)

看来您正在使用嵌套回调,而且我不是Java程序员,但您可能想对自己轻松一点,不要走那条路。

如果我匿名登录,您的意思是一次性密码验证流程(例如仅提供电话号码),那绝对是个好方法。

您可以使用Google Cloud Functions,但是必须使用Nodejs,Python或Go编写这些函数。

无论哪种方式,请看下面的流程:

  1. 用户请求OTP
  2. 确认请求
  3. 生成代码,将代码保存在后端(GCF)
  4. 向用户发送代码
  5. 用户向您发送了正确的代码
  6. 比较服务器上的代码
  7. 向用户发送某种令牌或您所说的“要点”来识别用户。

我相信Java确实支持JSON Web令牌。

因此,在设置GCF项目后,您将获得一些文件夹和文件,如下所示:

.firebaserc:一个隐藏文件,可帮助您在使用Firebase的项目之间快速切换。

firebase.json:描述项目的属性。

functions/:此文件夹包含您所有功能的代码。

functions/package.json:一个描述您的云功能的NPM软件包文件。

functions/index.js:您的Cloud Functions代码的主要来源。

functions/node_modules/:安装了所有NPM依赖项的文件夹。

您要导入所需的模块并初始化应用程序:

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const serviceAccount = require("./service_account.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://my-project.firebaseio.com"
});

您需要创建service_account.json,而不是库。

它将从Firebase控制台中获得一堆私钥和公钥。确保还将该文件也放入.gitignore文件中。

因此,我在这里跳过了一些关键的细节,您必须弄清楚一些关键问题。

首先,您需要一个用户的想法,因此需要在GCF中创建一个用户,这样它本身就将成为一个函数,并且正如您所提到的,Firebase是异步的,因此它看起来像这样:

const admin = require("firebase-admin");

module.exports = function(req, res) {
  // Verify the user provided a phone
  if (!req.body.phone) {
    return res.status(422).send({ error: "Bad Input" });
  }

  // Format the phone number to remove dashes and parens
  const phone = String(req.body.phone).replace(/[^\d]/g, "");

  // Create a new user account using that phone number
  admin
    .auth()
    .createUser({ uid: phone })
    .then(user => res.send(user))
    .catch(err => res.status(422).send({ error: err }));

  // Respond to user request saying account was made
};

因此,我上面的代码是从我以前的项目中获得的,除了整个内容都在JavaScript中。对您而言,这部分内容也将专门用JavaScript或Nodejs编写,因为同样,Nodejs,Go或Python是GCF支持的唯一语言。

所以这些评论是不言自明的,但是我不得不解释一下我必须解决的第一件事是如何在请求中将信息传递给该函数。

要做到这一点,我必须引用上面的req.body对象。 req.body包含用户调用时传递给此函数的所有不同数据。我不确定你是否知道这一点。因此,在复制粘贴上面的内容之前,请执行res.send(req.body);。因此,module.exports = function(req, res) {}中除res.send(req.body);之外没有其他内容,因此您可以很好地了解这一切的工作原理。

对于您创建的每个函数,您都需要运行firebase deploy name-of-project

感觉到可以解决所有问题并成功运行后,可以创建Android Studio项目并添加数据库依赖项,如下所示:

compile 'com.google.firebase:firebase-database:10.2.1'

然后您可能想要创建您的User模型,如下所示:

public class User {

    public String phone;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String phone) {
        this.phone = phone;
    }
}

依此类推,无论如何,我希望这种方法能给您一个足够好的主意,以助您一臂之力。祝你好运。我知道我没有花时间去解释我代码中的正则表达式是用来清理电话号码以及其他一些东西。再说一遍,不要只是复制粘贴我提供的内容,而是学习它。