【问题标题】:Firebase realtime database - filtering query not on client side Web/ReactFirebase 实时数据库 - 过滤查询不在客户端 Web/React
【发布时间】:2020-12-19 13:26:47
【问题描述】:

对 Firebase 来说很新,我在查询/过滤所需请求的逻辑上遇到了一些问题。

我的用户存储在 /users 中,他们有一个项目列表,例如:

users : {
  userA : {
    projects: {
      projectId1: true,
      projectId2: true
    },
    ...
  }
...
}

显然我有这样的项目:

projects: {
  projectId1: {
    name: "bla"
  }
  ...
}

我希望用户根据 ID 查询其项目列表中的所有项目。 现在我只能在客户端成功查询数据库的每个项目及其过滤器,但显然这有一些严重的安全隐患和加载时间,而且我不希望任何人查询所有项目并获取它们。我可以添加安全规则,但我无法访问任何内容,因为我无法再查询 /projects/ 但需要具体说明。

我正在使用https://github.com/CSFrequency/react-firebase-hooks/tree/master/database

并获得这样的数据:

  const [projects, loading, error] = useListVals(firebase.db.ref("projects"), {
    keyField: "uid",
  });

因此希望能够在此请求中添加一个投影数组,例如 where({ id is included in [projectsId]})

【问题讨论】:

  • 嗨@FrankvanPuffelen 感谢您的回答,这很有用。但是老实说,我们正在远离 Firebase,因为我们无法对数据库进行足够的控制,也无法在数据中实施适当的规则和连接。我想这是我们方面缺乏培训/知识,但我不得不承认使用 firebase 对我们来说并不是最流畅的体验:(
  • 很抱歉听到这个消息,感谢您让我知道 Ivo。如果我可以问:您正在采用什么解决方案?
  • 更经典的 MERN 堆栈(实际上使用了流星,所以不是完全的 MERN,而是流星/反应/蒙戈)

标签: reactjs firebase firebase-realtime-database filter react-hooks


【解决方案1】:

您需要分别为用户加载每个单独的项目,这与客户端连接操作非常相似。这并不像你想象的那么慢,就像Firebase pipelines the operations over a single connection

我没有看到您用于此类客户端连接的库中内置任何内容,但在常规 JavaScript 中,它是这样的:

let userRef = firebase.database().ref('users').child(firebase.auth().currentUser.uid);
userRef.once('value').then((projectKeys) => {
  let promises = [];
  projectSnapshot.forEach((projectKey) => {
    let key = projectKey.key;
    let projectRef = firebase.database().ref('projects').child(key);
    promises.push(projectRef.once('value');
  });
  Promise.all(promises).then((snapshots) => {
    console.log(snapshots.map(snapshot => snapshot.val()));
  });
});

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 2021-06-01
    • 2011-11-30
    • 2015-09-24
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多