【问题标题】:Firebase Firestore is not creating a doc - any idea how to debug?Firebase Firestore 没有创建文档 - 知道如何调试吗?
【发布时间】:2021-06-06 18:25:44
【问题描述】:

我一直在努力解决一个奇怪的错误。无法在 Firebase 中创建文档。没有安全规则可言,只是:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

Firestore 以正常方式初始化并处于活动状态:

import { Firebase } from "../db";
let firebase = Firebase();
let firestore = firebase.firestore();

但是在运行之后除了打印“here1”之外什么都没有发生,其他控制台没有做任何事情,并且没有创建用户 ID 文档,并且它下面没有集合和文档。

export const addEnquiry = async (data) => {
  let user = await firebase.auth().currentUser;
  data.uid = user.uid;

 console.log("here1");
  const enquiry = await firestore.collection("users").doc(data.uid).collection("enquiries").doc();
 
  return await enquiry
    .set(data)
    .then((doc) => {
console.log("here2");
      
      return true;
    })
    .catch((err) => {
console.log("here3");
      console.log(err);
      return false;
    });
};     

上面没有打印除“here1”以外的任何内容,并且卡在文档的设置上。该文档也不是在 Firestore 中创建的。

知道可能出了什么问题以及如何调试它吗?浪费了整整 4 个小时试图弄清楚它,并担心 Firestore 是否存在问题,以至于在生产中使用它是不安全的。

【问题讨论】:

  • 在你的代码中添加你如何满足 Firestore 类。如果您提供更多实际代码,我们或许能够查明您的错误
  • 您从哪里运行示例以及如何提供凭据?
  • 我已经扩展了这个例子,它是标准初始化,失败发生在设置上。第二个 firestore 命令没有产生预期的效果,只是默默地失败

标签: javascript firebase google-cloud-firestore


【解决方案1】:

首先,我向您保证 Firebase 一点儿问题都没有,我们已经在几个生产应用程序上运行了它,而且它们运行得非常好。

其次,我认为您的问题是您将函数作为 set() 方法中的第二个参数传递,这在 API reference 中找不到。相反,它返回一个承诺。您的代码应如下所示:

firebase.firestore()
        .collection("users")
        .doc(uid)
        .set({ uid: uid })
        .then((doc) => { console.log(doc.id) })
        .catch((err) => { console.log(err) })

干杯。

【讨论】:

  • 文档集参考在这里:firebase.google.com/docs/reference/js/…
  • 感谢您的消息,但不幸的是,它没有任何区别 - 根本没有创建文档!我什至关闭了所有安全规则,重新读取、写入所有内容,但它没有写入。如果不是firebase或其sdk的bug,那我就不知道是什么了,
  • 我刚刚注意到我在函数上有一个“等待”,尝试删除它。 @弗拉德
  • 在他们所有的例子中都在等待,但我试过没有它。还是行不通。除了firebase无法正常工作之外,我真的不知道问题可能是什么。我可以 console.log(firestore) 所以它连接得很好,我也可以得到当前用户,但我不能写任何东西!
【解决方案2】:

这是一个适合你的例子:

文件 test.mjs

import { Firestore } from '@google-cloud/firestore';

const firestore = new Firestore()


export default (uid) => firestore.collection("users")
  .doc(uid)
  .set({ uid })
  .then(() => console.log('success')) // documentReference.set() returns: Promise < void >
  .catch(err => console.error(err))

【讨论】:

  • 您发现问题中的代码有什么不同吗?我看到的唯一区别是我使用的是 npm firebase 模块: ``` import firebase from "firebase/app";导入“firebase/auth”;导入“firebase/firestore”; ```
  • 你在任何时候都在初始化 firebase,我在这里看不到。您是否已验证 firebase.auth().currentUser; 具有价值?作为仅供参考,您不需要任何这些等待或异步。 collection.doc() 不返回承诺。您正在使用 .then() 并在您的 .set() 调用中返回承诺。
  • firebase.auth().currentUser 甚至查询返回值和ID。在实际设置文档时,它会卡住而不会出错或成功。等待没有任何区别,无论哪种方式都不起作用,但在他们的示例中,他们使用了它们:firebase.google.com/docs/firestore/manage-data/…
  • 我不太明白为什么 firebase 不响应,无论如何。它只是沉默,永远不会到达或捕捉到。 enquiry.set(data) 是否可以以某种方式进行调试?一个永远不会解决的承诺,也无法看到问题所在
【解决方案3】:

这太奇怪了,但对我来说解决问题的是添加一个不必要的 doc.get() 像这样:

export const addEnquiry = async (data) => {
  let user = await firebase.auth().currentUser;
  data.uid = user.uid;

 console.log("here1");
  const enquiry = await firestore.collection("users").doc(data.uid).collection("enquiries").doc();
 
  const x = await firestore.collection("users").doc(data.uid).get(); 
// ^^^ added the above line I don't actually need, but somehow it 
// establishes a connection to firebase or something which allows the 
// promise below to resolve, rather than just hang! 
// Doesn't resolve without it for whatever reason!

  return await enquiry
    .set(data)
    .then((doc) => {
console.log("here2");
    
      return true;
    })
    .catch((err) => {
console.log("here3");
      console.log(err);
      return false;
    });
};     

删除线时,函数再次挂起。所以必须暂时保留它!

有点担心我们必须使用这种变通方法来简单地写入 Firestore,才能正常工作,Firebase!

尽管如此,希望它对面临这个无法调试的问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多