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功能作为中间件.
| 归档时间: |
|
| 查看次数: |
20732 次 |
| 最近记录: |