无法从Firebase函数访问数据库。
无法从Firebase函数访问数据库。
我尝试了所有方法,我有这个云函数(在其他情况下工作):
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); return response.send(error); }); }); admin.database().ref('/list').once('value').then(function(snapshot) { var event = snapshot.val(); app.tell('结果:' + 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("发生错误"); }); });
而且总是返回错误信息:"无法处理请求"。
或者我在部署时遇到错误:
每个then()应该返回一个值或抛出异常
我有一个名为list的集合,里面有一个名为"abc"的文档。
我是否需要包含某些内容?我是否需要在Firebase中进行设置才能使其工作?有没有什么基本的东西在文档上没有写?
在Firebase函数中无法访问数据库的原因可能是以下几点:
1. 代码中缺少对数据库的初始化和配置。
2. 数据库访问路径错误。
3. 数据库权限设置不正确。
解决方法如下:
1. 确保代码中已经对数据库进行了初始化和配置,例如使用admin.database()和admin.firestore()。
2. 检查数据库访问路径是否正确,例如使用database.ref('list')或firestore.collection('list')。
3. 检查数据库的读写权限是否正确设置,确保函数具有访问数据库的权限。
以下是解决方法的示例代码:
// 使用实时数据库 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); }); });
对于函数执行时间过长的问题,可能是Firestore冷启动引起的。可以等待一段时间以获得更好的性能。如果需要在函数完成后返回特定页面,可以在函数中调用response.redirect()、response.send()或response.end()来终止请求。
最后,需要注意的是,在上述示例代码中,响应应该在异步查询完成后才发送,可以在then()方法中发送响应,这样Cloud Function的执行速度会比1分钟更快。
问题出现的原因是在Firebase函数中无法访问数据库。解决方法是在使用get()
方法返回的promise解析之前,等待该promise完成后再发送响应。为此,需要使用then()
方法。另外,建议观看Firebase视频系列中关于"JavaScript Promises"的3个视频,链接为:https://firebase.google.com/docs/functions/video-series/。