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个视频感兴趣:你的答案真的解决了问题。非常感谢你。我的票数很低,所以我甚至不能投票给你,相反,我希望你有一段时间过得最好@很高兴我能帮忙!在写这篇文章的时候,我发现你确实有必要对我的答案进行投票。如果有帮助,请这样做。我也祝你过得愉快!!是的。顺便说一句,我现在对你的代码有一个问题,一个非常奇怪的问题-它会多次执行一个函数,我找不到解决方案,你能看一下吗?你的回答真的解决了问题。非常感谢你。我的票数很低,所以我甚至不能投票给你,相反,我希望你有一段时间过得最好@很高兴我能帮忙!在写这篇文章的时候,我发现你确实有必要对我的答案进行投票。如果有帮助,请这样做。我也祝你过得愉快!!是的。顺便说一句,我现在对你的代码有一个问题,一个非常奇怪的问题-它会多次执行一个函数,我找不到解决方案,你能看一下吗?