对不起,如果我的问题重复了,但是我没有找到其他有关此问题的帖子!
仅当新创建的数据包含一个引用其/packages/
文档的字段时,我才希望让用户创建一个新的users/{uid}
文档。
我在写文档时已经使用了以下函数来比较ref(这里是https://stackoverflow.com/a/56082683/7584576,顺便问一句!):
function refMatch(field) {
return request.auth != null && request.auth.uid != null && field in resource.data
&& resource.data[field] == /databases/$(database)/documents/users/$(request.auth.uid)
}
我对其进行了修改以访问请求中的数据(文档中尚不存在):
function createdRefMatch(field) {
return request.auth != null && request.auth.uid != null && field in request.resource.data
&& request.resource.data[field].path == /users/$(request.auth.uid)
}
它是这样使用的:
match /packages/{packageId} {
allow create: if createdRefMatch('user');
}
问题在于,即使request.resource.data[field].path == /users/$(request.auth.uid)
行看起来也应该起作用,但比较总是虚假的。当我调试firebase中的值时,事实证明,左侧始终是一个对象({"field":"..."}
),右侧始终是字符串。看来无论我是否使用.path
都不会改变任何东西,调试器总是显示对象而不是值。
我还尝试比较两个对象(不确定是否仍然可以这样做),但是问题是field
值中的一个以斜杠开头,而另一个则不是。
我什至试图像这样更改比较:
/databases/$(database)/documents/$(request.resource.data[field].path) == /databases/$(database)/documents/users/$(request.auth.uid)
但是随后$(request.resource.data[field].path)
部分以某种方式用类似百分比的url值代替了斜杠。
请,有人可以指出我可以更改使其工作吗?看起来,操作这些数据的不同方式会更改数据本身。真是个地狱:)
感谢您的时间!