无法从Firebase函数访问数据库。

13 浏览
0 Comments

无法从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中进行设置才能使其工作?有没有什么基本的东西在文档上没有写?

0
0 Comments

在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分钟更快。

参考链接:https://stackoverflow.com/questions/46717898#46750456

0
0 Comments

问题出现的原因是在Firebase函数中无法访问数据库。解决方法是在使用get()方法返回的promise解析之前,等待该promise完成后再发送响应。为此,需要使用then()方法。另外,建议观看Firebase视频系列中关于"JavaScript Promises"的3个视频,链接为:https://firebase.google.com/docs/functions/video-series/

0