Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何返回Firebase数据库中的文档数据?_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 如何返回Firebase数据库中的文档数据?

Javascript 如何返回Firebase数据库中的文档数据?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在学习React/Firebase,我有一个查询特定用户的父节点的函数 export const fetchUserDocument = (userId) => { const db = database.ref("users"); //if I write return here it outputs // const user = snapshot.val(); // return user; db.child(userId).on(&q

我正在学习React/Firebase,我有一个查询特定用户的父节点的函数

export const fetchUserDocument = (userId) => {
  const db = database.ref("users");
  //if I write return here it outputs
  //  const user = snapshot.val();
  //  return user;
  db.child(userId).on("value", (snapshot) => {
    const user = snapshot.val();
    return user;
  });
  //return db 

};

然后在另一个文件中,我可以调用此函数来检索如下用户数据
const user=await fetchUserDocument(userId)
,但当我
console.log(user)
onSnapshot为asnynchronous时,我将变得未定义,因此它无法立即向您返回值。您需要向fetchUserDocument传递回调函数,并在获得用户数据时调用它:

export const fetchUserDocument = (userId, cb) => {
  const db = database.ref("users");

  db.child(userId).on("value", (snapshot) => {
    const user = snapshot.val();
    cb(user);
  });
};

fetchUserDocument(userId, (user) => {
    console.log(user);
});
另一种方法是从fetchUserDocument返回承诺:

export const fetchUserDocument = async (userId) => {
    return new Promise((resolve, reject) => {
        const db = database.ref("users");

        db.child(userId).on("value", (snapshot) => {
            const user = snapshot.val();
            resolve(user);
        });
    });
};
这将为您提供所需的结果:

const user = await fetchUserDocument(userId);
console.log(user);

谢谢你的这两种方法。我想我会倾向于将我的大部分fetch实现为promise方法!只是一个后续问题。如果用户为空,我是否拒绝(用户)?这是返回有效/无效响应的好方法吗?当您有错误时,通常使用reject。例如,如果firebase返回一个错误,则捕获它并以reject结束承诺。