You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web端Firebase Realtime Database查询时snapshot.exists()始终返回true

问题原因

你遇到的snapshot.exists()始终返回true的核心原因是Firebase v9+ Realtime Database的get()方法传参用法错误。
get()方法仅接收一个参数,即你要查询的节点的引用对象,你当前传入的第一个参数是数据库根节点引用dbRef,第二个参数传入的别名路径是无效参数,本质上你每次都在查询整个数据库的根节点,根节点只要你的数据库正常存在就必然存在,因此exists()永远返回true。

修正方案

先创建指向对应别名节点的引用再执行查询即可,修正后代码如下:

import { getDatabase, ref, get, child } from "firebase/database";

const dbRef = ref(getDatabase());

function submitData() {
  var linkAlias = document.getElementById("alias").value;
  var linkInput = document.getElementById("text").value;
  var linkAuto = document.getElementById("auto").value;
  // 可选:别名非空校验
  if (!linkAlias.trim()) {
    alert("别名不能为空");
    return;
  }
  // 构造指向目标别名的节点引用
  const targetAliasRef = child(dbRef, linkAlias);
  get(targetAliasRef).then(function(snapshot) {
    if (snapshot.exists()) {
      console.log(snapshot.val());
      alert("This alias already exists!");
      return;
    } else {
      sendDataToDB(linkAlias, linkInput, linkAuto);
      alert("Success!")
    }
  }).catch(err => {
    // 可选:错误捕获处理
    console.error("查询失败:", err);
    alert("查询别名状态失败,请稍后重试");
  });
}
补充注意事项
  • 上述代码用到的child方法需要从firebase/database包中导入
  • 请确认你的Realtime Database安全规则开放了别名对应路径的读权限,否则会触发权限错误导致查询失败
  • 新增的空别名校验、错误捕获逻辑可根据你的实际需求保留或删除

内容的提问来源于stack exchange,提问作者rxnen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:06:09