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
相关产品推荐
相关产品推荐

