如何从Firestore规则中的请求路径获取数据



我正试图弄清楚如何从updatecreate上的路径中获取数组,以便根据路径数据创建验证器:

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