Javascript Firebase中的数据过滤
我正在匹配用户列表中的一个用户,如下所示:Javascript Firebase中的数据过滤,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在匹配用户列表中的一个用户,如下所示: export async function getLoginData(uid) { let loginData; const usersRef = await database.ref('users'); const snap = await usersRef.once('value'); snap.forEach((item) => { const itemVal = item.val(); if (item
export async function getLoginData(uid) {
let loginData;
const usersRef = await database.ref('users');
const snap = await usersRef.once('value');
snap.forEach((item) => {
const itemVal = item.val();
if (itemVal.uid === uid) {
loginData = itemVal;
}
});
return loginData;
}
就风格而言,我不喜欢这个。我更愿意对匹配进行筛选:
loginData = snap.filter((item) => item.val().uid === uid);
但筛选方法在快照中不可用。有没有一种方法可以从Firebase中编写更干净的单行数据检索?或者,它必须始终是一个前文和回调,正如我上面所说的那样?< P>在担心当前过滤方法的风格之前,最好考虑它的性能。您正在下载
/users
节点下的所有数据,然后过滤掉item.val().uid uid
中的任何内容。这样的客户端过滤会浪费用户的带宽
您应该尽可能使用Firebase的内置查询功能。在这种情况下,它似乎很简单:
let loginData;
const usersRef = await database.ref('users');
const snap = await usersRef.orderByChild('uid').equalTo(uid).once('value');
snap.forEach((item) => {
const itemVal = item.val();
loginData = itemVal;
});
在这种情况下,仍然需要循环。由于查询可能会匹配多个子节点,因此代码需要处理这种情况
如果您确信每个用户节点都有一个唯一的UID,您应该考虑以UID作为密钥(而不是另一个生成的密钥)存储用户数据:
将用户数据存储在密钥下可自动确保UID是唯一的,并使您无需查询即可查找用户数据。这也意味着您不再需要forEach()
:
let loginData;
const usersRef = await database.ref('users');
const snap = await usersRef.child(uid).once('value');
const itemVal = snap.val();
loginData = itemVal;
这也使您更容易从函数返回正确的承诺:
export async function getLoginData(uid) {
const snap = await database.ref('users').child(uid).once('value');
return snap.val();
}
您是否阅读了有关排序和筛选数据的文档?谢谢,道格。是的,我应该好好读一下。正如你所说,我是Firebase的新手。:-)
export async function getLoginData(uid) {
const snap = await database.ref('users').child(uid).once('value');
return snap.val();
}