我正试图弄清楚如何从update
或create
上的路径中获取数组,以便根据路径数据创建验证器:
function test() {
// option 1
return string(request.path).split('/')[0] == 'databases';
// option 2
// return string(request.resource.__name__).split('/')[0] == 'databases';
}
match /posts/{document} {
allow update: if test();
...
}
我已经用request.resource.__name__
和request.path
尝试了前面的两个例子。。。如何解析请求路径之外的数据?
谢谢,
J
假设这是我的请求。第/databases/%28default%29/documents/posts/123456
条。
function test(docId) {
// request.path supports map access.
return request.path[4] == '123456'; // this will return true;
return request.path[3] == 'posts'; // this will return true;
return docId == '123456'; // this will return true;
}
match /posts/{documentId} {
allow update: if test(documentId);
}
因此,如果你的路径有5个分段,request.path[4]
&;request.path[3]
将返回最后2个分段。
因此,没有办法最终将这些path
变量更改为我可以找到的数组或字符串:
- 请求.resource.名称
- 请求.路径
- 资源名称
- 任何
path()
类型
我们需要将它们更改为一个数组,以获得它们的大小。我们需要得到它们的大小,得到最后几个值。这对于在任意数量的子集合上工作的通用函数来说显然是有用的,在这些子集合中,您不必在match
中手动定义变量。
其他类似这样的帖子指出,很久以前,您可以将数据类型强制转换为类似string(request.path)
的string()
,但这不再有效。
你可以这样做:
function doSomething() {
return (request.path[4] && something1())
|| (request.path[6] && something2())
}
当然,您不希望对5个级别的子集合执行此操作。最终,如果不在之前定义变量,就不可能有一个通用函数。
也许Frank Van Puffelen可以将size()
函数或toString()
函数添加到路径变量中。
J