Javascript 在事务中访问新文档时的Firestore安全规则?

Javascript 在事务中访问新文档时的Firestore安全规则?,javascript,google-cloud-firestore,firebase-security,Javascript,Google Cloud Firestore,Firebase Security,我正在运行以下Firestore事务,以在帐户集合中创建新文档,并将其新创建的ID添加到用户的帐户。(相反,发送到帐户的成员对象包含用户ID。) 我使用的是没有路径的.collection('accounts').doc(),但我遇到了权限缺失或不足的情况。错误。我的规则如下: service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow r

我正在运行以下Firestore事务,以在
帐户
集合中创建新文档,并将其新创建的ID添加到用户的
帐户
。(相反,发送到帐户的
成员
对象包含用户ID。)

我使用的是没有路径的
.collection('accounts').doc()
,但我遇到了
权限缺失或不足的情况。
错误。我的规则如下:

service cloud.firestore {
  match /databases/{database}/documents {

    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }

    match /accounts/{accountId} {
        // allow read if user is a member or if the document does not exist
        allow read : if resource.data.members[request.auth.uid] == true || !exists(/databases/{database}/documents/accounts/$(accountId));

      // allow update, delete if user is a member
      allow update, delete: if resource.data.members[request.auth.uid] == true;

      // allow creation of any authenticated user
      allow create: if request.auth != null;
    }
  }
}

我已经把它缩小到
/accounts/{accountId}
上的
read
规则(如果我将它设置为
if true;
,它就可以工作)。我应该将其设置为什么以允许访问尚未“存在”的文档?

通过将规则更改为:

allow read, update, delete: if request.auth != null && (resource.data.members[request.auth.uid] == true || resource == null);
您可以在安全规则中使用以获取事务结束时(但在提交之前)的文档状态

因此,与阅读规则的人可能感到奇怪的
resource==null
不同,您可以使用:

allow read, update, delete: if request.auth != null && getAfter(/databases/$(database)/documents/accounts/$(accountId)).data.members[request.auth.uid] == true;

这简直快把我逼疯了!非常感谢。甚至做一个
!('createdBy'在resource.data中)
不起作用,我猜是因为
resource
为空。。但是,当然,没有办法调试这个并找出答案。
allow read, update, delete: if request.auth != null && getAfter(/databases/$(database)/documents/accounts/$(accountId)).data.members[request.auth.uid] == true;