Firebase Realtime Web 始终返回 True 到 snapshot.exists()
Posted
技术标签:
【中文标题】Firebase Realtime Web 始终返回 True 到 snapshot.exists()【英文标题】:Firebase Realtime Web Always Returns True to snapshot.exists() 【发布时间】:2022-01-04 01:51:58 【问题描述】:我正在使用 Firebase 实时数据库来创建一个简单的 URL 缩短器。我现在的目标是查看用户选择的别名并检查数据库是否已经存在。如果别名存在,则返回该函数并要求用户创建一个新别名。如果没有,则将数据添加到数据库中。
我遇到的问题是snapshot.exists()
总是返回true
。即使别名不在数据库中。我查看了this question 和其他几个问题,但它们都已有两年多了,可能已经过时了。
我的代码如下所示:
const dbRef = ref(getDatabase());
function submitData()
var linkAlias = document.getElementById("alias").value;
var linkInput = document.getElementById("text").value;
var linkAuto = document.getElementById("auto").value;
console.log(linkAlias)
get(dbRef, `$linkAlias`).then(function(snapshot)
console.log(linkAlias)
if (snapshot.exists() == true)
console.log(snapshot.val());
alert("This alias already exists!");
return;
else
sendDataToDB(linkAlias, linkInput, linkAuto);
alert("Success!")
);
【问题讨论】:
查找有关如何声明用户名的答案 - 它们需要与您在此处执行的操作相同的步骤,只是您存储的数据略有不同。另外,模块化SDK支持分段传入路径,请改用get(dbRef, 'pairs', linkAlias)
。
@samthecodingman 这是否意味着我也会使用 Firebase 身份验证?
Firebase 身份验证不是必需的,但它确实有助于允许某人稍后返回并编辑他们的链接(拼写错误、域更改等)。它还简化了稍后的审核控制,特别是如果有人来并滥用您的缩短器来做不可靠的事情 - 您可以终止他们创建的所有链接。如果您不希望用户登录,您可以忽略身份验证(适当调整您的安全规则 - 请参阅此 answer)或使用 anonymous authentication 代替。
@samthecodingman 感谢您提供的信息!现在,我想省略 Auth,因为我现在只是想创建一个原型。我的主要目标是确保别名不存在。我看过的所有问题都是多年前的问题,所以我认为我无法使用答案。
“我遇到的问题是 snapshot.exists() 总是返回 true。”这似乎出乎意料,与我对 API 的经验不符。您能否:1)更改您的代码以使用数据库中不存在的linkAlias
的硬编码值? 2) 显示一个屏幕截图,显示您的数据库中不存在linkAlias
值? 3) 显示该组合的console.log(snapshot.exists())
输出?这种reproduction 使我们更有可能发现问题,或者使用您的示例尝试在我们自己的示例中重现它。
【参考方案1】:
在我看来,在尝试解决这个问题数周之后,最好使用我的代码认为只是单个别名的快照的对象。相反,它是所有别名及其 URL 的字典。
例如,我可以定义我的快照值:
var codeData = snapshot.val();
然后我可以在字典键或值中搜索别名:
if (Object.keys(codeData).includes(linkAlias) === true)
...
我会选择这个答案,因为没有其他方法对我有用。
【讨论】:
以上是关于Firebase Realtime Web 始终返回 True 到 snapshot.exists()的主要内容,如果未能解决你的问题,请参考以下文章
从 firebase-realtime-database 过滤数据
在 Firebase-Realtime Database 上使用啥规则让用户注册和登录?
Flutter firebase realtime db 在规则中使用 displayName
Flutter:Firebase Realtime 从对象列表中删除对象