如何在nodejs中等待onValue从Firebase实时数据库返回值

问题描述 投票:0回答:2

我有一个来自 Firebase 的 getData 函数和 onValue 函数。但是当我调用它时,它不会等待 onValue 完成,结果会返回 undefined

这是getData函数:

function getData(path) {
    try {
        const reference = ref(database, path);
        onValue(reference, (snapshot) => {
            const data = snapshot.val();
            console.log('DATA: ' + data);
            return data;
        }, (error) => {
            console.error(error);
            return undefined;
        });
    } catch (error) {
        console.error(error);
        return undefined;
    }
    console.log('END!');
}

当我调用该函数时,控制台如下所示:

END!
DATA: *[correct data]*

我已经尝试将其设为变量而不是函数。 有人知道我如何让它等待 onValue 完成。

javascript node.js firebase firebase-realtime-database
2个回答
0
投票

如果您只想获取一次值,则应该使用

get()
而不是
onValue

function getData(path) {
    try {
        const reference = ref(database, path);
        return get(reference).((snapshot) => {
            const data = snapshot.val();
            console.log('DATA: ' + data);
            return data;
        }, (error) => {
            console.error(error);
            return undefined;
        });
    } catch (error) {
        console.error(error);
        return undefined;
    }
    console.log('END!');
}

所有日志记录使该功能比所需的复杂得多,因此提炼其本质是:

function getData(path) {
    const reference = ref(database, path);
    return get(reference).((snapshot) => snaphot.val());
}

0
投票

我也遇到了同样的情况,通过阅读这篇文章找到了解决方案: https://github.com/firebase/firebase-js-sdk/issues/6941

总之,我必须更改这段代码

let results = [];
onValue(documentRef, (snapshot) => {
  const data = snapshot.val();
  results.push(data);
}
return data;

对于另一个

let results = [];
onValue(documentRef, (snapshot) => {
  if(snapshot.exists()){
    snapshot.forEach((doc) => {
      let item = doc.val();
      item.key = doc.key;
      results.push(item);
    });
  }
}
return results;

希望有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.