【问题标题】:Firestore - unexpected readsFirestore - 意外读取
【发布时间】:2020-11-10 06:56:52
【问题描述】:

伙计们,我确实有一个有趣的问题,如果你们中的任何人能够帮助我解决这个问题,我将非常高兴。

我的应用流程是什么:

  1. 使用邮箱、密码和其他一些详细信息注册:
  2. 用户 firebase 以验证用户身份并通过电子邮件和密码创建帐户,同时我将用户的自定义数据写入数据库。
  3. 用户登录。

就是这样,这就是我所有的基本逻辑,你怎么能看到我没有从数据库中读取任何数据。

现在...问题是,由于某些奇怪的原因,当我注册我的用户时,我要去 firebase 控制台查看我的数据库的使用情况,我会看到类似...对于一个用户已创建我将有 1 次写入(这很好,正如我预期的那样),但也有 13-20 READS FROM DB

现在这是我的问题,为什么在我只进行身份验证和写入时,我在 firestorm 上读取

这是我现在正在使用的数据库代码。

class DatabaseFirebase implements BaseDataBase {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final FirebaseStorage _storage = FirebaseStorage.instance;

  FirebaseUser _firebaseUser;
  Firestore _firestore = Firestore.instance;

  @override
  Future<String> login(String email, String password) async {
    _firebaseUser = await _firebaseAuth.signInWithEmailAndPassword(
        email: email, password: password);
    return _firebaseUser.uid;
  }

  @override
  Future<String> register(String email, String password) async {
    _firebaseUser = await _firebaseAuth.createUserWithEmailAndPassword(
        email: email, password: password);
    return _firebaseUser.uid;
  }

  @override
  Future<UserData> getCurrentUser() async {
    if (_firebaseUser == null)
      _firebaseUser = await _firebaseAuth.currentUser();
    UserData user = UserData();
    user.email = _firebaseUser?.email;
    user.name = _firebaseUser?.displayName;
    return user;
  }

  @override
  Future<void> logout() async {
    _firebaseAuth.signOut();
  }

  @override
  Future<void> onAuthStateChanged(void Function(FirebaseUser) callback) async {
    _firebaseAuth.onAuthStateChanged.listen(callback);
  }

  @override
  Future<void> writeUser(UserData user) async {
    _firestore.collection("Users").add(user.toMap()).catchError((error) {
      print(error);
    });
  }
}

如果你们中的一些人知道,能否向我解释一下我需要在哪里/如何搜索才能找到这个错误?因为你怎么能看到我没有使用任何 read what so ever.

【问题讨论】:

  • 你有什么安全规则吗?
  • 是的,我愿意service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // allow read, write: if false; allow read, write; } } }
  • 我相信安全规则会导致读取,但这不太可能发生在这里。执行此操作时是否打开了 Firestore 控制台?因为在那里看到文档算作阅读。
  • 是的,但我只在 Database->Usage 上有它,这并不是真正的原因。我的意思是我已经无数次地重新启动了页面并且它没有发生任何事情。在我从应用程序写入用户之后,我看到读取次数不断增加。

标签: firebase flutter dart firebase-authentication google-cloud-firestore


【解决方案1】:

鉴于我们不了解访问您数据库的所有可能路径,因此无法确定,但您应该知道,使用 Firebase 控制台会导致读取。如果您在写活动繁忙的集合/文档上保持控制台打开,控制台将自动读取更新控制台显示的更改。这通常是意外读取的来源。

如果没有完全复制您正在采取的所有步骤,就无法确定。

Firebase 目前不提供工具来跟踪文档读取的来源。如果您需要测量来自您的应用的特定读取,您必须以某种方式自行跟踪。

【讨论】:

  • 感谢保持 Firebase 控制台打开会导致读取的建议。在我的代码中,我与 Firebase 的唯一交互是这一行:await db.collection(collection).doc(id).set(docData);,不知何故,我的阅读次数达到了顶峰!关闭 Firebase Cloud Firestore 数据控制台后,读取计数停止增加。
  • 我在理解如何计算读取时遇到同样的问题:stackoverflow.com/questions/63005295/…。我的控制台有 9 次写入。在不到一个小时的时间内,我的阅读量达到了 53000 次,其中包含 3 个文档,每个文档具有 2 个属性。我有相同的无法解释的读取计数 - 我看不出我的设置是如何“繁忙的控制台”。在 Cloud Firestore 文档中很难找到关于如何计算读取的清晰说明。 @drigofonte - 你明白了吗?
  • 如果在 Firestore 控制台打开时在 Chrome 中打开“网络”选项卡,您可以看到请求在后台进行。这些累积了大量读取计数。我刚刚访问了一个收集一个文档的控制台,并将其打开 30 秒,读取计数约为 9-12 次读取。所以是的,永远不要长时间访问控制台。
猜你喜欢
相关资源
最近更新 更多