【问题标题】:How to read a value from Realtime Databse using Cloud Functions?如何使用 Cloud Functions 从实时数据库中读取值?
【发布时间】:2019-06-22 20:00:23
【问题描述】:

我有一个 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 的值吗?

【问题讨论】:

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


    【解决方案1】:

    一般来说,你不能像这样简单地加速一个简单的数据库写入。请注意,Cloud Functions 有一个 unavoidable cold start 时间,用于在新服务器实例上首次调用您的函数。

    我实际上根本不希望你的函数能够工作,因为你没有返回一个承诺,当你的函数中的所有异步工作都完成时,它就会解决。您有义务这样做,以便您的function terminates normally

    【讨论】:

      【解决方案2】:

      您必须使用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>`
              );
           });
      });
      

      【讨论】:

      • 你能指出这段代码有什么不同之处,可以解决 OP 遇到的问题吗?
      • 通过 HTTP 请求调用函数。这允许调用同步函数
      • @Matthias 你试过了吗?
      • @Umbro 显然,OP 希望其云功能“在 [his] 实时数据库中的某个值发生变化时触发”。默认情况下,通过 HTTP 请求调用函数不会满足此要求。
      猜你喜欢
      • 2023-03-16
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多