无法从Firebase函数访问数据库

时间:2019-05-03 09:59:58

标签: firebase google-cloud-functions

我尝试了一切,我具有此云功能(否则可以正常工作):

     exports.contentServer = functions.https.onRequest((request, response) => {
          admin.database().ref('/list/' + "abc").once('value').then(function(snapshot) {
              console.log(snapshot.val() );
              return null;
              }).catch(function(error) {
                  console.log("Error getting document:", error);
                  return response.send(error);
              });

 });

还是这个:

     admin.database().ref('/list').once('value').then(function(snapshot) {
        var event = snapshot.val();   
        app.tell('Result: '+event);
   });

和这个:

     exports.contentServer = functions.https.onRequest((request, response) => {


          var db = admin.database();


            db.ref("list/abc").once("value").then(snap => {
              var store = snap.val().description;
              return store;
            }).then(() => {
              var store = snap.val().description;
              return store;
            }).then(snap => {
              var store = snap.val().description;
              return store;
            }).catch(err => {
              console.log(err);
              response.send("error occurred");
            });

 });

总是得到错误信息:

  

“无法处理请求”

或者在部署该程序时出现错误:

 Each then() should return a value or throw 

我有一个名为 list 的集合,里面有一个名为“ abc” 的文档。

我必须包括一些东西吗?我必须在Firebase中进行设置才能使其正常工作?有什么基本的没人写的文档吗?

2 个答案:

答案 0 :(得分:2)

在上述说明之后进行了修改,以解释OP使用Firestore而不是实时数据库

您应该执行以下操作。在发送回响应之前,您必须等待get()方法返回的promise解析。为此,您需要使用then()方法,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

 exports.contentServer = functions.https.onRequest((request, response) => {
      admin.firestore().collection('list').doc('abc').get()
      .then(docSnapshot => {
          console.log(docSnapshot.data());
          return response.send(docSnapshot.data()); // or any other value, like return response.send( {result: "success"} );
      })
      .catch(error => {
          console.log("Error getting document:", error);
          return response.status(500).send(error); 
      });
});

如上面的评论所述,我建议您观看Firebase视频系列中有关“ JavaScript承诺”的3个视频:https://firebase.google.com/docs/functions/video-series/

答案 1 :(得分:0)

尝试一下

已更新。按照@Renaud Tarnec指出的,在then()中返回响应。

使用实时数据库

exports.contentServer = functions.https.onRequest((request, response) => {
     var database = admin.database();
     database.ref('list').child('abc').once("value", snapshot => {
         const data = snapshot.val();
         return response.send(data);
     }).catch(error => {
         return response.status(500).send(error); 
     });
});

如果您使用的是Firestore。

exports.contentServer = functions.https.onRequest((request, response) => {
     const firestore = admin.firestore();
     firestore.collection("list").doc('abc').get().then(doc => {
         console.log(doc.data());
         return response.send(doc.data());
     }).catch(error => {
         return response.status(500).send(error);
     });
});

重要提示:不要忘记通过调用response.redirect(), response.send(), or responses.end()终止请求,这样可以避免运行太长时间的函数产生过多费用