Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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 如何检查用户名是否可用,如果可用,使用事务将其存储在CloudFireStore中以保持数据一致性?_Javascript_Firebase_Google Cloud Firestore_Transactions - Fatal编程技术网

Javascript 如何检查用户名是否可用,如果可用,使用事务将其存储在CloudFireStore中以保持数据一致性?

Javascript 如何检查用户名是否可用,如果可用,使用事务将其存储在CloudFireStore中以保持数据一致性?,javascript,firebase,google-cloud-firestore,transactions,Javascript,Firebase,Google Cloud Firestore,Transactions,现在我要检查用户名是否存在 await _firestore .collection('users') .where('username', isEqualTo: username) .limit(1) .get() .then((value) { if (value.docs.isEmpty) { available = true; } else { available = false;

现在我要检查用户名是否存在

  await _firestore
      .collection('users')
      .where('username', isEqualTo: username)
      .limit(1)
      .get()
      .then((value) {
    if (value.docs.isEmpty) {
      available = true;
    } else {
      available = false;
    }
  });
但是我不能在事务中使用异步函数

    _firestore.runTransaction((transaction) {
      return transaction.get("USER UID").then((_) {
        if (USERNAME EXISTS) // this obviously doesnt work {
          transaction.set(
            docRef,
            {'username': username},
          );
        } 
      });
    });
在保持数据一致性的同时保存用户名等唯一值的最佳做法是什么? 基本上如何原子地实现这两个操作->检查用户名是否不存在并将其写入数据库(如果可用)

要确保数据库中的用户名(或任何其他值是唯一的),必须将该值用作文档的键。否则,无法保证跨值,因为您不能保证所有客户端都将使用事务来写入数据。因此,为了确保用户名是唯一的,创建一个
用户名的集合,例如,每个文档只包含声明该用户名的用户的UID。然后,您可以使用安全规则来确保两个集合同时更新。