gpt4 book ai didi

Firebase 数据库规则 – `data.exists()` 似乎总是正确的,可能是错误吗?

转载 作者:行者123 更新时间:2023-12-02 19:39:04 29 4
gpt4 key购买 nike

我正在尝试保护我的 Firebase 数据库以允许创建新记录,但不允许删除现有记录。最终,我计划在我的应用程序中使用 Firebase 身份验证,并允许用户更新现有记录(如果他们是作者),但我试图首先让简单的案例发挥作用。

但是!无论我在数据库规则模拟器中尝试什么,无论文档 seems to suggest 是什么,data.exists() 的值似乎总是 true。据我所知the documentation ,变量 data 表示数据库中的一条记录,就像操作发生之前一样。也就是说,对于创建,data 不会存在,而对于更新/删除,data 将引用数据库中存在的真实记录。 情况似乎并非如此,以至于我实际上怀疑 Firebase 中存在错误,因为在我的数据库上设置以下规则时,禁止所有写入操作:

{
"rules": {
".read": true,
".write": "!data.exists()"
}
}

无论我在模拟器中输入什么值,无论是位置还是数据。我什至编写了一个小型 EmberJS 应用程序来验证模拟器是否说真话,并且它也被拒绝所有写入操作的权限。

我真的不知道从这里该去哪里,因为我几乎没有什么可尝试的。我尝试从数据库中删除所有记录,这让模拟器认为它可以执行写入操作,但我的测试应用程序仍然得到 PERMISSION_DENIED,所以我不知道是什么导致了不一致。

我对预定义data变量的理解正确吗?如果是这样,为什么我不能编写我想要的规则?我见过snippets从字面上看,我试图实现我的“只创建,不删除”规则,这似乎符合我的理解。

最后说明:我正在一个全新的 Firebase 项目中尝试此操作,仅使用上述规则,并且我的数据库中只有一些垃圾数据记录。

最佳答案

因为您已将 !data.exists() 放置在数据库的根位置,所以 data 引用整个数据库。只有当数据库完全为空时,您才能写入数据。

您表示您仅使用我的数据库中的一些垃圾数据记录来运行测试。。这些记录将导致 data.exists() 为 true。

您可以通过将 !data.exists() 规则放置在树中您想要要求不存在任何数据的特定位置来实现您的目标。这通常是在带有通配符键的位置完成的,如您链接的示例所示:

{
"rules": {
// default rules are false if not specified

"posts": {
".read": true, // everyone can read all posts

"$postId": {
// a new post can be created if it does not exist
// existing posts can only be edited by their original "author"
".write": "!data.exists() && newData.exists() || data.child('author').val() == auth.uid",
".validate": "newData.hasChildren(['title', 'author', 'timestamp'])",
}
}
}
}

关于Firebase 数据库规则 – `data.exists()` 似乎总是正确的,可能是错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44944969/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com