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

Firebase 9中如何通过ID查询记录?Vuex场景下的适配方案

问题描述

在Vuex中编写了一个action用于请求Firebase数据库,希望通过ID获取指定记录,但不清楚在Firebase 9中该如何传入ID进行过滤。当前代码返回了所有记录而非指定ID的记录,当前代码如下:

async fetchRecordById({ dispatch, commit }, id) {
      try {
        let record
        const uid = await dispatch('getUid')
        const dbRef = ref(getDatabase());
        const snapshot = await get(child(dbRef, `/users/${uid}/records`), id);
        record = snapshot.val()

        if (record === null) {
          record = {}
        }

        return {...record, id}
      } catch (e) {
        commit('setError', e)
        throw e
      }
    },

Firebase 8中的实现方式如下:

const record = (await firebase.database().ref(`/users/${uid}/records`).child(id).once('value')).val() || {}

请问该如何适配到Firebase 9版本?

解决方案

问题出在调用get方法时的参数传递错误。Firebase 9的模块化API中,get方法的第二个参数是可选配置项(比如source),而非查询条件。要获取指定ID的记录,需要把ID直接拼接在数据库引用的路径里,对应Firebase 8中.child(id)的操作。

修改后的代码如下:

async fetchRecordById({ dispatch, commit }, id) {
      try {
        let record
        const uid = await dispatch('getUid')
        const dbRef = ref(getDatabase());
        // 将id拼接到child的路径中,对应Firebase 8的.child(id)
        const snapshot = await get(child(dbRef, `/users/${uid}/records/${id}`));
        record = snapshot.val()

        if (record === null) {
          record = {}
        }

        return {...record, id}
      } catch (e) {
        commit('setError', e)
        throw e
      }
    },

核心变化:

  • 移除get方法的第二个参数id,转而将id添加到child方法的路径参数里,变成/users/${uid}/records/${id},直接指向指定ID的记录节点,而非整个records节点。
  • 调整后调用get返回的snapshot就是对应ID的单条记录,不会再返回所有记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:25:58