Firebase可调用函数读取实时数据库

时间:2020-04-21 14:28:25

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions

在这里,我试图通过提供UID从实时数据库访问用户数据。我已经尝试了很多东西,但是都没有成功。我已经按照文档操作,但是运气不好,我一直在出错-

Sending back results [promise]

另一个example用来编写我用来创建逻辑的数据,但是它没有用-

service.ts:160 POST https://us-central1-gokuapp.cloudfunctions.net/userData 500
error.ts:66 Uncaught (in promise) Error: INTERNAL
    at new YN (error.ts:66)
    at XN (error.ts:175)
    at rC.<anonymous> (service.ts:231)
    at tslib.es6.js:100
    at Object.next (tslib.es6.js:81)
    at r (tslib.es6.js:71)

我在客户端遇到的错误是-

{{1}}

编辑:之前,我已经正确地编写了代码,但是根据在发现过程中所做的更改,我得到了错误或空对象。曾经遇到过同样问题的任何人,只要记住这一点……“云功能需要时间热身才能完全发挥作用”,尽管我非常感谢@Frank van Puffelen和@oug Stevenson供他们输入。 :) :) :)

2 个答案:

答案 0 :(得分:2)

请勿在Cloud Functions中使用on(),因为这会将持久性侦听器附加到查询(并且不会返回承诺)。改用once()一次查询数据,并用快照保证解决问题。另外,您应该使用snapshot.val()来获取包含快照内容的普通JavaScript对象。

return ref.once('value')   // use once() here
    .then(snapshot => {
        return {
            data: snapshot.val()   // also use val() here to get a JS object
        };
    })
    .catch((error) => {
        throw new functions.https.HttpsError('unknown', error.message, error);
    });

答案 1 :(得分:0)

可调用云函数可以返回任何JSON数据。但是,您的app.post('/by-pass-api',function(req, response){ const url = req.body.url; console.log("calling url", url); request.get( url, (error, res, body) => { if (error) { console.error(error) return response.status(200).json({'content': "error"}) } return response.status(200).json(JSON.parse(body)) }, ) }) 变量是const options = { method: 'POST', headers: {'content-type': 'application/json'}, url:`http://localhost:3000/by-pass-api`, // your environment data: { url }, // your https request here }; 对象,它不仅包含JSON数据,还包含更多内容。

您可能希望返回快照的值:

snapshot