我有一个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
上的值?
答案 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>`
);
});
});