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 从对象列表中删除对象

如何从 Firebase Realtime DB 读取孩子的值?

如何使用 Firebase RealTime 数据库根据特定类别获取项目集合