找不到函数错误:名称:[get]。在Firestore安全规则模拟中

Har*_*Kal 6 firebase google-cloud-firestore firebase-security-rules

match /UserProfile {
    match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }
Run Code Online (Sandbox Code Playgroud)

当我尝试使用上述安全规则从UserProfile / {uId}获取数据时,在Firestore和代码中抛出以下错误,提示权限不足:

Error running simulation — Error: simulator.rules line [199], column [28]. Function not found error: Name: [get].
Run Code Online (Sandbox Code Playgroud)

现在上面两个函数的定义在这里

function isUserLoggedIn(){
    return request.auth != null;
}

function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}
Run Code Online (Sandbox Code Playgroud)

第一个功能运行得很好,但是第二个功能却不能

它抛出该错误

据我所知,功能还不错

请帮助我在这个问题上浪费了很多时间

我尝试过的

  1. 我在其中一个线程中读到这是一个暂时性问题,但事实并非如此。现在已经超过48小时
  2. 在某处还提到这仅是模拟器中的错误,但是代码可以平稳运行,即使不是这种情况。在代码中,错误是我所期望的权限不足
  3. 我已经正确阅读了文档,所以我的代码可以在其他规则中测试get方法,并且可以正常工作

多数民众赞成在请帮助

Jua*_*ara 5

更新:错误是规则模拟器中的错误,请参阅下面的道格评论。

我尝试了您的规则,它们在模拟器中按预期工作。

规则:

match /UserProfile {
  function isUserLoggedIn(){
    return request.auth != null;
  }

  function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
  }

  match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }
}
Run Code Online (Sandbox Code Playgroud)

在模拟器中测试查询:

get /UserProfile/foo
Authenticated: Yes
Firebase UID: bar
Run Code Online (Sandbox Code Playgroud)

根据UserSettings/foo数据库中的文档,请求成功或失败:

拒绝要求:

/UserSettings/foo    
{
 content: "my content"
 blocked: { bar: true }
}
Run Code Online (Sandbox Code Playgroud)

允许请求:

/UserSettings/foo    
{
 content: "my content"
 blocked: { otheruser: true }
}
Run Code Online (Sandbox Code Playgroud)

我认为,如果数据不存在或格式不正确,则会弹出错误。

例如,如果删除/UserSettings/foo文档,我还会收到:

Error: simulator.rules line [58], column [28]. Function not found error: Name: [get].
Run Code Online (Sandbox Code Playgroud)

如果该blocked字段不是地图(因为这in是地图的函数),那么我也会收到此错误:

Error: simulator.rules line [58], column [95]. Function not found error: Name: [in].
Run Code Online (Sandbox Code Playgroud)

您可能可以通过使用exists并检查的类型来清除这些错误,blocked但是无论哪种方式,您的规则仍应按预期拒绝请求。

  • 与团队确认-这是模拟器中的错误。 (9认同)
  • 我会称这是模拟器中的错误,因为不存在的文档不应该产生这样的错误。但它应该不符合规则。 (2认同)