“对象上未定义属性资源”
您不能在 Firebase 规则表达式中使用不存在的属性。
例如,以下内容将引发类似的错误。
read: if request.foobar == 'some value';
那是因为foobar
不存在,并且规则会提出它是undefined
。与'some value'
右侧的情况永远不会发生,并且不会评估其余的规则表达式。
类似的对象request
实施Map()
界面。
https://firebase.google.com/docs/reference/rules/rules.Map https://firebase.google.com/docs/reference/rules/rules.Map
所以你可以使用重写你的规则Map.get()
方法不会引发错误并为缺失的条目提供默认值。
read: if request.get('foobar', null) == 'some value';
所以现在我们可以安全地引用foobar
在我们的规则中。
我有一个函数(并且我已经在没有函数的情况下对其进行了测试,只是为了检查参考或其他内容是否没有问题):
并非规则中的所有请求都会产生resource
。如果该文档不存在resource
属性于request
从未设置。因此尝试读取它会产生上述错误。您可以通过检查来解决此问题null
.
function resourceIsValidSomething() {
return request.get('resource', null) != null && request.resource.data.something;
}
您可能仍然会收到类似的规则错误false for "get" & L10
那是因为request.get('resource', null) != null
检查将导致规则失败。您可以决定allow访问不存在的文档以便完成查询。
该规则看起来像这样。
function resourceIsValidSomething() {
return request.get('resource', null) == null || request.resource.data.something;
}
因此,允许访问缺失的资源或仅访问具有data.something
.
由您决定哪种方法最适合您的用例。