【问题标题】:Uncaught TypeError: firebase.firestore().......set is not a function at HTMLButtonElement.<anonymous>未捕获的类型错误:firebase.firestore().......set 不是 HTMLButtonElement 的函数。<anonymous>
【发布时间】:2020-06-17 16:09:34
【问题描述】:

我使用 Firebase 开发网络应用。 我收到此错误消息

Uncaught TypeError: firebase.firestore(...).collection(...).orderBy(...).limit(...).set is not a function
    at HTMLButtonElement.<anonymous> (main.js:152)

因为这段代码。

firebase.firestore().collection('script').orderBy('timestamp','desc').limit(1).set({
    finaltext: resultText.value,
    name: firebase.auth().currentUser.displayName,
    uid: firebase.auth().currentUser.uid
  },{merge: true}).catch(function(error){
    console.error('Error writing new message to Firestore', error);
  });

我搜索了 Internet,但找不到出现此错误消息的原因。 请给我一些建议好吗?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    您需要先使用get() 获取所需的文档,然后再使用set()(带有合并选项)或update() 写入新字段。

    firebase.firestore().collection('script').orderBy('timestamp','desc').limit(1).get()
    .then(querySnapshot => {
        if (!querySnapshot.empty) {
            //We are sure the document exists, we can then use update()
            return querySnapshot.docs[0].ref.update({
              finaltext: resultText.value,
              name: firebase.auth().currentUser.displayName,
              uid: firebase.auth().currentUser.uid
            });
        } else {
           throw new Error("No document");
        }
    })
    .catch(error => {
        console.log("Error:", error);
    });
    

    注意get()方法返回的是QuerySnapshot,所以你需要做querySnapshot.docs[0]来获取查询返回的唯一doc对应的DocumentSnapshot

    【讨论】:

      【解决方案2】:

      方法limit返回一个Query类型的值:

      限制

      limit ( limit : number ) : Query &lt; T &gt;

      创建并返回一个只返回第一个匹配文档的新查询。

      https://firebase.google.com/docs/reference/js/firebase.firestore.Query#limit

      因此,当您要检索数据时,orderBylimit 都可以使用。如果您想向数据库中添加数据,只需执行以下操作:

      firebase.firestore().collection('script').set({
          finaltext: resultText.value,
          name: firebase.auth().currentUser.displayName,
          uid: firebase.auth().currentUser.uid
        },{merge: true}).catch(function(error){
          console.error('Error writing new message to Firestore', error);
        });
      

      【讨论】:

      • 非常感谢您的回答。我想更新最新的文档。因此,从“脚本”收集,按时间戳排序并限制一个文档。我想更新,而不是添加。我希望我的话能传达出我想做的事情。
      • 你需要使用get() then 而不是设置firebase.google.com/docs/firestore/query-data/…
      • 感谢您的回复。如果我使用get(),我只会得到文档。文档已经有字段和数据,所以我想添加新的字段和数据。
      • 我选择了另一个人作为最佳答案,但我从你的答案中学到了很多东西。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 2020-07-31
      • 2017-06-25
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多