当前位置: 首页 > 知识库问答 >
问题:

Firebase HTTP云函数-一次性读取数据库

齐乐逸
2023-03-14

我有一个火基HTTP功能。该函数需要根据查询参数从 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('/');

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

在一个HTTP函数中从数据库读取一次有正确的方法吗?我可以用正常的Firebase SDK吗,或者有更好的方法吗?

谢了。

共有2个答案

宋耀
2023-03-14

你混淆了两个部分:

    < Li > < code > firebase-functions 模块,它包含基于使用< code > functions . database . ref('/path ')的数据库调用进行触发的逻辑。onWrite()。 < Li > < code > firebase-admin 模块,它允许您的函数调用数据库。

由于您有一个HTTP函数,您应该触发,如HTTP函数的留档所示:

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

然后,在函数中,访问数据库,如Admin SDK的文档所示:

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系统终止。请参阅留档的这一部分。

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

长孙哲
2023-03-14

我找到了解决方案,将如何获取参数的答案与Michael Blight关于如何从云函数内部运行查询的答案结合起来?

那里的答案还显示了使用火库管理员所需的内容。

以下方法适用于我调用 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>`
        );
     });
});
 类似资料:
  • 我正在尝试使用 azure 函数读取 azure blob 内容。 容器名称始终相同,Blob名称由触发该函数的队列消息传递。 当我运行此函数时,函数超时(超过5分钟)。 带有blob名称的队列消息是正确的并显示出来,blob只包含一个长json,大约是292kb。 我尝试在创建新blob时直接触发该函数,但它返回了一个带有流的对象,您知道任何方法使该流可读吗? 使用上面的代码,我可以正确获取bl

  • 我正在尝试使用Firebase Cloud功能为iOS应用程序创建设备到设备推送通知。每当在数据库中的引用'/user-通知/{通知RecipientUid}/{挑战ID}'处创建新子节点时,我都想触发一个事件。这是我的index.js代码: 当在该位置的数据库中添加新的子数据库时,我收到此错误,“类型错误:函数.数据库.ref(...)。一次不是一个函数“,在 Firebase 控制台的函数日志

  • 我正在开发一个物联网应用程序,需要从PubSub主题读取流数据。我想使用Google云数据流SDK读取这些数据。我正在使用Java 1.8 我正在使用谷歌云平台的试用版。当我使用PubSubIO时。Read方法读取流数据时,我在日志文件中发现错误,我的项目没有足够的CPU配额来运行应用程序。 所以我想使用谷歌云数据流SDK读取流数据。 请有人告诉我在哪里可以找到使用Google Cloud Dat

  • 当我想从实时数据库更新CloudFireStore时,我部署了下面的代码,结果出错。 TypeError:无法读取导出时未定义的属性“ref”。改变现状。功能。数据库参考onUpdate。事件(/user\u code/index.js:18:20)在cloudfunctionnewsignation(/user\u code/node\u modules/firebase functions/l

  • 当我尝试使用Firebase部署--Only函数命令部署到一个新的Firebase项目时,我收到了这个错误。我有两个正在使用的项目,一个开发人员和一个prod,我正在处理prod和部署现在也工作得很好,但是当我添加这个项目开发时,部署在prod中保持工作良好,但在这个新项目开发中没有。相反,我得到了这个错误: 错误:解析函数触发器时发生错误。 TypeError:无法读取Object上未定义的属性

  • TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据。 从文件读取数据: 在TensorFlow图的起始, 让一个输入管线从文件中读取数据。 预加载数据: 在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。 目录 数据读取 供给数据(Feeding) 从文件读取数据