firebase-cloud-function noob在这里。
我正在努力尝试从https firebase云函数读取数据库值。
例如,将此https://us-central1-database-daa11.cloudfunctions.net/test?deviceID=DEV-14SfJ6
放在浏览器中应返回一个显示lmvBlnf9dhXvbc8SuOD3it
我具有以下数据库结构:
{
"devices" : {
"DEV-14SfJ6" : {
"mode" : "die_hard",
"registred" : "true",
"user" : "lmvBlnf9dhXvbc8SuOD3it"
},
"DEV-3Xrcwr" : {
"mode" : "die_hard",
"registred" : "true"
"user" : "lmvBlnf9dhXvbc8SuOD3it"
}
}
并且我已经部署了以下测试功能来读取设备的用户参数。例如DEV-14SfJ6。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
//
//
//
exports.test = functions.https.onRequest((request, response) => {
var db = admin.database();
const deviceID = request.query.deviceID;
console.log("Sent device ID", deviceID);
response.send("test ok");
var val2;
db.ref("/devices/" + deviceID + "/user").once("value").then(snap => {
val2 = snap.val();
response.statusCode(200).send(val2);
console.log(val2)
return db.ref("/devices/" + deviceID + "/user").set(val1+1);
}).catch(err => {
console.log(err);
response.send("error occurred");
});
});
但是,正如您所料,没有什么好事情发生。 感谢您的帮助。
答案 0 :(得分:3)
您的功能有几个问题。
首先,val1
从未真正定义过。通过将/devices/DEVICEID/user
(原始数据中的字符串)设置为val1 + 1
,尚不清楚您要做什么。
第二,statusCode
不是函数,您需要status(200)
(或忽略它,默认值为200)。
但是真正的问题是函数语义和Promise的一般处理。
对于http / https函数,一旦调用response.send()
,就function terminates。
因此,您要确保在执行此操作之前先进行数据库更新。此外,您的函数两次调用send
-在访问数据库之前调用一次,然后在第一次调用数据库之后调用一次(在catch中一次)。
修复过程看起来像这样,但是由于您不清楚要执行的操作,因此我无法提供确切的代码:
exports.test = functions.https.onRequest((request, response) => {
var db = admin.database();
const deviceID = request.query.deviceID;
console.log("Sent device ID", deviceID);
var val2;
db.ref("/devices/" + deviceID + "/user").once("value").then(snap => {
val2 = snap.val();
console.log(val2)
return db.ref("/devices/" + deviceID + "/user").set('some new value');
}).then(() => {
response.status(200).send(val2);
}).catch(err => {
console.log(err);
response.send("error occurred");
});