Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firestore安全错误:缺少更新方法或更新方法不充分_Javascript_Google Cloud Firestore - Fatal编程技术网

Javascript Firestore安全错误:缺少更新方法或更新方法不充分

Javascript Firestore安全错误:缺少更新方法或更新方法不充分,javascript,google-cloud-firestore,Javascript,Google Cloud Firestore,根据下面的规则,我将得到一个缺少或权限不足的错误,但仅适用于更新。我可以创建新文档,但任何更新写入都被拒绝。我错过了什么 match /msgs/{msgs} { allow create: if request.resource.data.keys().hasAll(["name", "msg", "status", "time"]) && request.resource.data.size() == 4 &&

根据下面的规则,我将得到一个缺少或权限不足的错误,但仅适用于更新。我可以创建新文档,但任何更新写入都被拒绝。我错过了什么

match /msgs/{msgs} {
allow create: if request.resource.data.keys().hasAll(["name", "msg", "status", "time"]) &&
                request.resource.data.size() == 4 &&
                request.resource.data.name is string &&
                request.resource.data.msg is string &&
                request.resource.data.status is string &&
                request.resource.data.status == "new" || "viewed" &&
                request.resource.data.time is timestamp;
allow update: if request.resource.data.size() == 1 &&
                request.resource.data.keys().hasAll(["status"]) &&
                request.resource.data.status is string &&
                request.resource.data.status == "new" || "viewed";
}
我的更新代码非常简单:

docRef.update({
        status: "viewed"
    })

我认为这里的问题是,在
update
上,大小不是“正在更新的字段数”,而是“更新应用于请求之后,但提交更新之前的对象大小”。这意味着,
request.resource.data
除了被写入的内容之外,还被现有的字段/值“水合”。然后检查以确保只有一个字段在更改

这意味着您的规则可能如下所示:

allow update: if request.resource.data.size() == resource.data.size() &&
                 request.resource.data.name == resource.data.name &&
                 request.resource.data.msg == resource.data.msg &&
                 request.resource.data.time == resource.data.time &&
                 request.resource.data.status == "new" || "viewed";

从Firebase支持团队收到解决方案。事实证明,您需要使每个.data.key值声明独立且不同。因此,实现这一规则的正确方法是:

request.resource.data.status == "new" || "viewed";
是这样的:

request.resource.data.status == "new" || request.resource.data.status == "viewed";

谢谢大家的帮助。

request.resource.data.size()
确实让它听起来像是我发送的负载大小,而不是Firebase发送的负载大小。不过还是要谢谢你!有没有办法减少重复性?创建两个数据的映射,删除
状态
字段并进行比较?同意,我们正在努力更好地记录这一点(或者重新考虑如何显示更新的大小)。至于后者,不幸的是目前并不容易。