Firebase HTTP云功能 - 一次读取数据库

Ste*_*son 16 javascript firebase firebase-realtime-database google-cloud-functions

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

Firebase JS SDK说使用以下方法执行此操作:

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

但是,云功能示例包括:

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

functions.database.ref('/');
Run Code Online (Sandbox Code Playgroud)

但是数据库引用没有这个方法once,只有onWrite(https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder).这显然适用于DB写入功能,而不是HTTP功能.

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

谢谢.

MGR*_*ing 41

我找到了解决方案,在这里结合答案如何获取参数和Michael Blight的答案 如何从Cloud函数内部运行查询?

答案还显示了使用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>`
        );
     });
});
Run Code Online (Sandbox Code Playgroud)


Fra*_*len 11

你混淆了两个部分:

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

由于您具有HTTP功能,因此您应该触发HTTP功能文档显示:

exports.data = functions.https.onRequest((req, res) => {
  // ...
});
Run Code Online (Sandbox Code Playgroud)

然后在您的函数中,您将访问数据库,因为Admin SDK文档显示:

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

所以总的来说:

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);
  });
});
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个棘手的模式.对数据库的调用是异步发生的,可能需要一些时间才能完成.在等待时,HTTP功能可能超时并被Google Cloud Functions系统终止.请参阅文档的此部分.

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