Can';t从Firebase函数访问数据库

Can';t从Firebase函数访问数据库,firebase,google-cloud-functions,Firebase,Google Cloud Functions,我什么都试过了,我有这个云功能(如果不是这样的话,它可以工作): 或者也包括: admin.database().ref('/list').once('value').then(function(snapshot) { var event = snapshot.val(); app.tell('Result: '+event); }); 这是: exports.contentServer = functions.https.onR

我什么都试过了,我有这个云功能(如果不是这样的话,它可以工作):

或者也包括:

     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 
我有一个名为“列表”的集合,里面有一个名为“abc”的文档

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

试试这个

已更新。返回
then()
中的响应,正如@Renaud Tarnec指出的那样

使用实时数据库

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()或response.end()
来终止请求,这样可以避免运行时间过长的函数产生过多的费用

已更新。返回
then()
中的响应,正如@Renaud Tarnec指出的那样

使用实时数据库

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()或responses.end()
来终止请求,这样您就可以避免运行时间过长的函数产生过多的费用

根据上面解释OP使用Firestore而不是实时数据库的注释进行修改

你应该这样做。在返回响应之前,必须等待方法返回的承诺得到解决。为此,您需要使用
then()
方法,请参阅


如上面的评论所述,我建议您观看Firebase视频系列中关于“JavaScript承诺”的3个视频:

根据上面的评论进行修改,解释OP使用Firestore而不是实时数据库

你应该这样做。在返回响应之前,必须等待方法返回的承诺得到解决。为此,您需要使用
then()
方法,请参阅



如上面的评论所述,我建议您观看Firebase视频系列中关于“JavaScript承诺”的3个视频:

Error:无法处理请求。我有一种感觉,有些事情真的很奇怪。我甚至不能再把事情记录到控制台上了。这里会发生什么?你在用星火计划吗?也许你已经到了库塔@condalismI可以在日志上看到它记录了一些文本,我可以看到执行的函数开始了,然后我看到它结束了,过了一会儿我看到Null,这意味着我猜他在对DB的调用中打印了Null。所以我的DB有一个名为list的集合,里面有一个名为abc的文档,但由于某种原因它找不到它。(您的代码包含once()两次,因此我删除了其中一个)。它只是无法从函数中读取DB。“函数执行耗时11毫秒,完成状态代码:200”,他需要10秒钟才能从DB函数中获取返回值,然后打印空值。@RenaudTarnec有意义。谢谢。错误:无法处理请求。我有一种感觉,有些事情真的很奇怪。我甚至不能再把事情记录到控制台上了。这里会发生什么?你在用星火计划吗?也许你已经到了库塔@condalismI可以在日志上看到它记录了一些文本,我可以看到执行的函数开始了,然后我看到它结束了,过了一会儿我看到Null,这意味着我猜他在对DB的调用中打印了Null。所以我的DB有一个名为list的集合,里面有一个名为abc的文档,但由于某种原因它找不到它。(您的代码包含once()两次,因此我删除了其中一个)。它只是无法从函数中读取DB。“函数执行耗时11毫秒,完成状态代码:200”,他需要10秒钟才能从DB函数中获取返回值,然后打印空值。@RenaudTarnec有意义。谢谢。你可能会对Firebase视频系列中关于“JavaScript承诺”的3个视频感兴趣:你可能会对Firebase视频系列中关于“JavaScript承诺”的3个视频感兴趣:你的答案真的解决了问题。非常感谢你。我的票数很低,所以我甚至不能投票给你,相反,我希望你有一段时间过得最好@很高兴我能帮忙!在写这篇文章的时候,我发现你确实有必要对我的答案进行投票。如果有帮助,请这样做。我也祝你过得愉快!!是的。顺便说一句,我现在对你的代码有一个问题,一个非常奇怪的问题-它会多次执行一个函数,我找不到解决方案,你能看一下吗?你的回答真的解决了问题。非常感谢你。我的票数很低,所以我甚至不能投票给你,相反,我希望你有一段时间过得最好@很高兴我能帮忙!在写这篇文章的时候,我发现你确实有必要对我的答案进行投票。如果有帮助,请这样做。我也祝你过得愉快!!是的。顺便说一句,我现在对你的代码有一个问题,一个非常奇怪的问题-它会多次执行一个函数,我找不到解决方案,你能看一下吗?