【问题标题】:Firebase HTTP Cloud Functions - Read database onceFirebase HTTP Cloud Functions - 一次读取数据库
【发布时间】:2017-10-10 07:43:37
【问题描述】:

我有一个 Firebase HTTPs 功能。该函数需要根据查询参数从 Firebase 数据库中读取一个值,并根据该数据返回一个结果。

Firebase JS SDK 说要使用:

return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = snapshot.val().username;
  // ...
});

但是,云函数示例有:

var functions = require('firebase-functions');

functions.database.ref('/');

但是数据库引用没有once的方法,只有onWritehttps://firebase.google.com/docs/reference/functions/functions.database.RefBuilder)。这显然是针对 DB 写入函数,而不是 HTTP 函数。

在 HTTP 函数中是否有正确的方法从数据库中读取一次?我可以使用普通的 Firebase SDK,还是有更好的方法?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我找到了将这里关于如何获取参数的答案和 Michael Blight 的答案结合起来的解决方案 How to run query from inside of Cloud function?

    那里的答案还显示了使用 firebase-admin 需要什么。

    调用 my-project.firebaseapp.com/event/123/ 时,以下内容适用于我。

    var functions = require('firebase-functions');
    const admin = require('firebase-admin');
    
    admin.initializeApp(functions.config().firebase);
    
    exports.showEvent = functions.https.onRequest((req, res) => {
        const params = req.url.split("/");
        const eventId = params[2];
        return admin.database().ref('events/' + eventId).once('value', (snapshot) => {
            var event = snapshot.val();
            res.send(`
                <!doctype html>
                <html>
                    <head>
                        <title>${event.name}</title>
                    </head>
                    <body>
                        <h1>Title ${event. name} in ${event.city}</h1>
                    </body>
                </html>`
            );
         });
    });
    

    【讨论】:

    • 我怎样才能得到我最后返回的数据?我看不懂
    【解决方案2】:

    你混淆了两个部分:

    • firebase-functions 模块,其中包含基于functions.database.ref('/path').onWrite() 的数据库调用触发的逻辑。
    • firebase-admin 模块,它允许您的函数调用数据库。

    既然你有一个HTTP函数,你应该触发documentation for HTTP functions shows

    exports.data = functions.https.onRequest((req, res) => {
      // ...
    });
    

    然后在您的函数中,您以documentation for the Admin SDK shows 的身份访问数据库:

    return admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {
      var username = snapshot.val().username;
      // ...
    });
    

    总之:

    exports.date = functions.https.onRequest((req, res) => {
      admin.database().ref('/users/' + userId).once('value').then(function(snapshot) {
        var username = snapshot.val().username;
        res.status(200).send(username);
      });
    });
    

    请注意,这是一个棘手的模式。对数据库的调用是异步发生的,可能需要一些时间才能完成。在等待期间,HTTP 函数可能会超时并被 Google Cloud Functions 系统终止。见this section of the documentation

    作为一般规则,我建议使用 Firebase 数据库 SDK 或其 REST API 来访问数据库,而不是依赖 HTTP 函数作为中间件。

    【讨论】:

    • firebase-admin 是否在函数中自动进行身份验证?我需要从数据库中获取信息并根据数据呈现 HTML 部分,因此不幸的是,在这里使用 Firebase DB REST api 并不是一个真正的选择。
    • 我认为您的答案中缺少一些回报。获取有关期望返回或 try/catch 块的承诺的 ESLint 错误。
    • 也应该是admin.database,因为在firebase函数中你使用const admin = require('firebase-admin');
    • @Badrush,你不知道你为我节省了多少小时的工作时间。没有 admin.database().ref(.....) 它不断给出错误
    • @user3833732 我和你在同一个地方。花了整整两天时间试图弄清楚如何获取 firebase 函数以从 db 获取数据,然后从 firebase 存储中提供文件。最后事情开始变得有意义,我发现了这个错误。很高兴我能帮忙 =)
    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2017-09-28
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多