每次我尝试从实时数据库调用数据时,第一次尝试都返回null,但在第二次请求时获得正确的数据
那就是我的代码
module.exports.getAllPosts = async () => {
await db.dbRef.child("posts").on('value', function (snap) {
temp = snap.val();
return;
});
return temp;
};
我到处都使用异步功能,但仍然无法正常工作 我正在使用express调用此函数
答案 0 :(得分:1)
与许多现代的Web API一样,数据是从Firebase异步加载的。这意味着主要代码将继续运行,并且在加载数据之后将调用回调函数。
通过在代码中添加一些日志记录,您可以最好地看到这一点:
console.log("Before attaching listener");
await db.dbRef.child("posts").on('value', function (snap) {
console.log("Got data");
});
console.log("After attaching listener");
运行此代码时,您将得到:
在附加侦听器之前
附加监听器后
获得数据
这可能不是您期望的顺序。但这完全说明了您的代码为什么不起作用:在您的return temp
运行时,尚未加载数据,而temp
就是开始加载数据之前的状态。 / p>
解决方案是不尝试立即返回数据,而是返回所谓的数据承诺。由于您的顶级功能已被标记为async
,因此这是一个简单的更改:
module.exports.getAllPosts = async () => {
return await db.dbRef.child("posts").on('value', function (snap) {
return snap.val();
});
};