【问题标题】:retrieve data from a list of specific IDs in Firebase, follow user and only get their posts从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子
【发布时间】:2017-10-30 09:09:25
【问题描述】:

我有一个用户列表,他们每个人都可以发布事件并互相关注,当他们这样做时,数据库将生成一个带有userId 对象的feed 对象和他们可以看到的事件列表,就像这样:

Mo4JxyP4FCRtXYtNZAqs4EsLtTh2tq3bugOm5pRE2PxpmllKzUhKjty1 是用户 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 });
      });
    });
  };
};

【问题讨论】:

    标签: javascript reactjs firebase firebase-realtime-database redux


    【解决方案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),这样您就可以限制提要上的项目数量了。
    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2018-10-04
    相关资源
    最近更新 更多