【问题标题】:How do you read data from firestore?你如何从firestore读取数据?
【发布时间】:2019-05-27 22:44:01
【问题描述】:

我正在尝试学习如何使用 Firestore。

google documentation 说试试这种格式:

db.collection("users").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
});

所以,我用它来做到这一点(将 db 更改为 fsDB,将“users”更改为“newsletters”

fsDB.collection("newsletters").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
});

当我尝试此操作时,我收到一条错误消息,提示未定义 querySnapshot。附上错误消息的屏幕截图。

我看过this post,并尝试了它的建议如下:

fsDB.collection("newsletters").query.get().then(function(querySnapshot) { 

                            if (querySnapshot.empty) { 
                                console.log('no documents found');
                            } else {
                                    querySnapshot.docs.map(function (documentSnapshot) {
                                        console.log(documentSnapshot.data().name); 
                                    });
                            }

                        });

此尝试使用 if 语句生成解析错误,但我也找不到解决该问题的方法。

这一定有一个简单的解决方案,但我不知道如何从数据库中获取记录。

下一次尝试

我尝试将代码移到 return 语句上方并放入变量中,如下面的屏幕截图所示,但它仍然会产生错误,如图所示。无论我是否保留或丢失 querySnapshot 周围的括号,这些错误都是相同的。

添加状态

class Fndate extends React.Component {
    state = {
        options: [],
        anzic: [],
        country: [],
        region: [],

    }

    selectCountry (val) {
        this.setState({ country: val });
      }

      selectRegion (val) {
        this.setState({ region: val });
      }

    async componentDidMount() {
        // const fsDB = firebase.firestore(); // Don't worry about this line if it comes from your config.
        let options = [];
        await fsDB.collection("abs_for_codes").get().then(function (querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, ' => ', doc.data());
            options.push({
                value: doc.data().title.replace(/( )/g, ''),
                label: doc.data().title + ' - ABS ' + doc.id
            });
            });
        });


        let anzic = [];
        await fsDB.collection("anzic_codes").get().then(function (querySnapshot) {
        querySnapshot.forEach(function(doc) {
            console.log(doc.id, ' => ', doc.data());
            anzic.push({
                value: doc.data().Title.replace(/( )/g, ''),
                label: doc.data().Title + ' - ANZIC ' + doc.id
            });
            });
        });


            await fsDB
            .collection("newsletter")
            .get().then((querySnapshot) => {
                querySnapshot.forEach((doc) => {
                console.log(`${doc.id} => ${doc.data().email}`);
                }
            );
            });

        this.setState({
            options,
            anzic
        });
    }

5]5

【问题讨论】:

  • “我收到一条错误消息,提示未定义 querySnapshot” ????错误消息是指代码的哪一行?我认为这不太可能是您问题中的任何代码
  • @Phil - 它指的是这个查询语句:querySnapshot.forEach((doc) => { console.log(${doc.id} => ${doc.data()}); });
  • 错误信息究竟是什么?如果您可以发布显示其上下文的屏幕截图,那可能会有所帮助。您是否绝对确定问题中的代码与您的实际代码匹配,包括大写/小写字符?
  • @Phil - 附上截图
  • 我确定。我一直在交替使用复数和单数,以确保没有关于搜索记录的不成文规则。但同样的错误仍然存​​在

标签: javascript firebase google-cloud-firestore


【解决方案1】:

我相信您正在使用 React,我刚刚意识到您正在调用 render 方法中的相关方法。

尝试在componentDidMount 中进行操作。可以参考here

所以你的代码会是这样的:

class YourClass extends React.Component {
   componentDidMount(){
      fsDB.collection("newsletters").get().then((querySnapshot) => {
         querySnapshot.forEach((doc) => {
            console.log(`${doc.id} => ${doc.data()}`);
         });
      });
   }
   render(){
      return (....your existing jsx....)
   }
}

请注意,我不知道您的类名或您如何定义组件。但是我只是说您需要将代码移动到componentDidMount

我们无法查看您的整个文件。但我确信这是一个语法错误(尤其是 JSX)

【讨论】:

  • 我试过这个。我得到与使用其他常量在 return 语句上方定义变量相同的错误。我有它异步。我上面的帖子中显示的相同语法错误仍然存​​在,控制台不记录数据。
  • 实际上,如果我在其上放置一个等待标签,这将有效。感谢您的帮助
  • 对于 jsx 捕获数据并显示它的反应文档中的示例,我无法理解。这看起来像我正在寻找的位,但我不知道在这个 mount 语句中如何处理它: const list = this.listRef.current;
  • @Mel,你能在你的问题中给我们你的整个组件吗?这样,我们可以帮助您实现目标。我猜你需要使用setState。而且我认为您不需要使用 await,但我无法进一步帮助您,因为我看不到您的组件
  • 嗨@kkesley - 状态在上面添加
【解决方案2】:

我认为你应该去掉“.query”。 如果集合中有数据,.empty 将返回 false。 但我想知道,为什么在你的情况下 querySnapshot 未定义。

db.collection("lessons").get()
  .then(function(querySnapshot) { 
    if (!querySnapshot.empty) {
        querySnapshot.docs.map(function(documentSnapshot) {
        console.log(documentSnapshot.data().name); 
     })
    } else {
    console.log('no documents found');
    }   
});

控制台

【讨论】:

  • 这给出了相同的错误 - 使用上面标记的 if 语句。感谢您尝试提供帮助。一定有一种简单的方法可以从数据库中读取数据!这是我试图找出它是什么的第二天!
  • @Phil 已经回答了上面这个谜题的一部分
【解决方案3】:

您可以为此使用自动脚本。 您只需要 python 和 firebase_admin。

  1. pip install firebase_admin
  2. 下载https://github.com/harshit0209/firestore_backup
  3. 现在运行 getData.py 脚本。
  4. 为其提供您的 Firebase 项目私钥的路径。
  5. 现在给出文档名称。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 2020-04-19
    • 2021-09-02
    • 2018-10-26
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多