从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子
Posted
技术标签:
【中文标题】从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子【英文标题】:retrieve data from a list of specific IDs in Firebase, follow user and only get their posts 【发布时间】:2017-10-30 09:09:25 【问题描述】:我有一个用户列表,他们每个人都可以发布事件并互相关注,当他们这样做时,数据库将生成一个带有userId
对象的feed
对象和他们可以看到的事件列表,就像这样:
Mo4JxyP4FCRtXYtNZAqs4EsLtTh2
和 tq3bugOm5pRE2PxpmllKzUhKjty1
是用户 ID,-KIMxxx: true
是事件帖子。
在一个单独的events
对象中,我将事件的详细信息存储在那里:
目前,我在 redux 中检索所有事件,如下所示:
export const eventsFetch = () =>
return (dispatch) =>
firebase.database().ref(`/events/`)
.on('value', snapshot =>
dispatch( type: EVENTS_FETCH_SUCCESS, payload: snapshot.val() );
);
;
;
如何重写该方法,使其仅从用户 ID 下的事件 ID 列表中检索数据?我试着做
firebase.database().ref(`/feed/$this.auth.currentUser.uid`)
先获取对象,然后使用Object.keys()
获取类似["eventId1", "eventId2"]
的数组,但现在我卡住了,不知道如何循环遍历所有对象
firebase.database().ref(`/events/$eventId`)
并像上面显示的方法一样将所有数据一起发送...不确定我是否要使用.once('value)
,因为我想在用户取消关注/关注时更新事件列表。
奖金请求,如果可能的话,正如您在events/$eventId/timeAsDate
中看到的那样,每个事件都有时间,我想隐藏/不检索过去的事件。
谢谢
更新 感谢弗兰克的回答,我终于可以使用以下代码:
export const eventsFetch = () =>
const currentUser = firebase.auth();
return (dispatch) =>
firebase.database().ref(`/feed/$currentUser.uid`).on('value', snapshots =>
const values = snapshots.val() || ;
const entryIds = Object.keys(values);
const promises = entryIds.map(
eventId => firebase.database().ref(`/events/$eventId`).once('value')
);
Promise.all(promises).then(results =>
results.forEach(result =>
values[result.key] = result.val();
);
dispatch( type: EVENTS_FETCH_SUCCESS, payload: values );
);
);
;
;
【问题讨论】:
【参考方案1】:这样的事情应该可以解决问题:
export const eventsFetchForUser = (uid) =>
return (dispatch) =>
firebase.database().ref(`/feed/$uid`)
.on('value', snapshot =>
var promises = [];
snapshots.forEach((key) =>
promises.push(
firebase.database().ref(`/events/$key.key`)).once('value')
);
);
Promise.all(promises).then((snapshots) =>
const values = snapshots.map(snapshot => snapshot.val));
dispatch( type: EVENTS_FETCH_SUCCESS, payload: values );
);
);
;
;
所以这首先从用户的提要中加载键,然后按其键加载每个帖子,最后提取每个帖子的快照的值,然后再分派它。
注意:我没有运行这个,所以可能有错别字。
【讨论】:
您的Promise.all
呼叫无法正确解析 - 您需要转至 Promise.all(promises).then((snapshots) => //Results here )
糟糕。好一个。谢谢你抓。固定。
嗨@FrankvanPuffelen 非常感谢您帮助解决另一个 Firebase 问题!我让它工作并更新了我的问题。另外,如果我想按时间对事件进行排序,而不是显示过去的事件,我应该在此方法中处理该逻辑,还是在之前或之后在另一种方法中处理?再次感谢
听起来很适合这种方法。但我会更新用户的提要,在这种情况下将时间戳作为一个值(而不仅仅是true
),这样您就可以限制提要上的项目数量了。以上是关于从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子的主要内容,如果未能解决你的问题,请参考以下文章
检索 Firebase NoSQL/JSON 数据的最佳方式?