Firebase Functions响应快照问题:无法正确返回数据
问题分析与解决方案
你写的两段代码都错用了Firebase的API,onCreate是实时数据库的触发器函数,作用是监听指定路径下有新数据创建时自动执行,根本不是用来主动读取数据的方法,这就是你遇到问题的根源:
- 第一段代码里,HTTP请求进来后你注册了
onCreate触发器,但这个触发器只有当company/路径下有新数据创建时才会执行,所以你的HTTP请求永远等不到回调触发,一直处于加载状态。 - 第二段代码里,
res.send(data)在onCreate回调执行前就已经运行了,此时data还没被赋值,自然返回undefined。
正确实现方式:主动读取数据
要在HTTP云函数里读取实时数据库的数据,应该用once('value')方法——这个方法会一次性读取指定路径的数据,并且返回一个Promise,完美适配异步流程。
写法1:使用Promise链式调用
exports.getCompanies = app.https.onRequest((req, res) => { const companyRef = app.database.ref("company/"); // 用once('value')读取数据,返回Promise companyRef.once('value') .then(snapshot => { const data = snapshot.val(); res.send(data); // 读取到数据后再返回响应 }) .catch(error => { res.status(500).send(`读取数据失败:${error.message}`); }); });
写法2:使用async/await(更简洁)
exports.getCompanies = app.https.onRequest(async (req, res) => { try { const companyRef = app.database.ref("company/"); const snapshot = await companyRef.once('value'); const data = snapshot.val(); res.send(data); } catch (error) { res.status(500).send(`读取数据失败:${error.message}`); } });
补充说明
你之前本地REST API能正常返回,大概率是因为本地用了同步读取的方式,或者误打误撞处理了异步流程,但Firebase的数据库API全是异步的,必须通过Promise(或者回调,但Promise更优雅)来等待数据读取完成后再返回响应。
内容的提问来源于stack exchange,提问作者Benjamin Kararic
相关产品推荐
相关产品推荐

