如何使用Cloud Functions从实时数据库读取值?

时间:2019-06-22 20:00:23

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

我有一个Cloud Functions,它会在实时数据库中的某个值发生更改时触发。之后,我需要从数据库中读取另一个值。

我在网上搜索并找到了一种解决方案。它的工作原理是:/ID/temp_id的值更改后立即触发了该函数,但是读取/ID/I的值又花了5秒钟。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.getID = functions.database.ref("/ID/temp_id").onUpdate((change, context)=>{   //triggers the function when value "temp_id" changes
  const tempID = change.after.val();

  const i_snap = admin.database().ref("/ID/i").once("value", function(snapshot){      //read the value at "/ID/i" from the databse
    const i = snapshot.val();
  })

})

有什么方法可以更快地读取/ID/I上的值?

2 个答案:

答案 0 :(得分:1)

通常,您不能像这样简单地加速简单的数据库写入。请注意,在新服务器实例上首次调用函数时,云函数需要unavoidable cold start时间。

我实际上根本不希望您的函数能够正常工作,因为您不会返回一个在函数中所有异步工作都完成时会解决的承诺。您必须这样做,以便您的function terminates normally

答案 1 :(得分:0)

您必须使用functions.https通过HTTP请求触发功能。这允许调用同步功能。 使用functions.https创建一个处理HTTP事件的函数。 HTTP函数的事件处理程序侦听onRequest()事件。 用作onRequest()的参数,Request对象使您可以访问客户端发送的HTTP请求的属性,而Response对象则使您可以将响应发送回客户。

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

更多详细信息文档:https://firebase.google.com/docs/functions/http-events

看下面的例子:

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

admin.initializeApp(functions.config().firebase);

//Call function via HTTP requests. This allows invoke a synchronous function 
exports.showValue = functions.https.onRequest((req, res) => {
    const params = req.url.split("/");
    const tempId = params[2];
    return admin.database().ref('ID/' + tempId).once('value', (snapshot) => {
        var value = snapshot.val();
        res.send(`
            <!doctype html>
            <html>
                <head>
                    <title>${value.name}</title>
                </head>
                <body>
                    <h1>Title ${value. name}, id ${value.id}</h1>
                </body>
            </html>`
        );
     });
});