Firebase云功能在https.onrequest()上读取/更新数据库

时间:2019-11-24 12:48:10

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

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");
        });
      });

但是,正如您所料,没有什么好事情发生。 感谢您的帮助。

1 个答案:

答案 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");
  });