【问题标题】:Firebase Realtime Database - Set up multiple .on() listeners based on access nodesFirebase 实时数据库 - 基于访问节点设置多个 .on() 监听器
【发布时间】:2020-11-07 14:35:37
【问题描述】:

我正在使用具有以下结构的 Firebase 实时数据库。 我希望获取用户有权访问的所有“注释”并订阅这些注释中的更改。

notes: {
  "noteId-1345" : {
    "access" : {
      "author": "1234567890"
        "members": {
          "1234567890": 0 <--- Author
          "0987654321": 1 <--- Member
        }
      },
    "data" : {
      "title": "Hello",
      "content": "Konichiwa!",
      "comment": "123"
    }
  }
}

(我知道这种结构在理想情况下可以更平坦。:))

要获取用户有权访问的所有笔记 - 我在根目录中保留了一个额外的 user_notes 节点: 每当我将用户(members 的更新)与注释相关联时,我都会同时更新 /notes/$noteid/user_notes/$uid

user_notes: {
  "$uid": {
    "noteId-1345": {
      myHide: false,
      mySortOrder: 0,
      title: "Hello"
    }
  }
}

在获取数据时,我希望订阅用户有权访问的所有笔记。

我首先获取用户有权访问的注释的 ID,然后附加侦听器以订阅每个 note 中的更新。

const uid = getState().auth.uid
let collectedNotes = {} 
...
database.ref(`user_notes/${uid}`).on('value', (myAccessSnaps) => {
  myAccessSnaps.forEach((accessSnap) => {
    const noteId = accessSnap.key
    const privateData = {'personalData': {...accessSnap.val()}}
    database.ref(`notes/${noteId}`).on('value', (noteSnap)=>{
      const notData = noteSnap.val()
      const fullData = { ...privateData, ...notData }
      const note = {
        id: noteSnap.key,
        ...fullData
      }
      collectedNotes[note.id] = note
      ...
    })
  }))
})

(当然,在设置新的侦听器之前,我需要使用.off() 分离侦听器)

这有点问题,因为我必须为每个 note 附加一个侦听器 - 并且数据库中可能有数百条注释。 这是最有效的方法吗? - 似乎效率低下。

有没有办法用一个监听器收听用户在/notes路径中可以访问的ALL注释?还是我的接近完全错误? :)

亲切的问候 /K

【问题讨论】:

    标签: javascript firebase firebase-realtime-database nosql


    【解决方案1】:

    在了解.on() does not return a promise之后 - 我变得更容易解决我的问题。

    附加大量.on() 听众对我来说没有任何意义。

    对我来说最简单的方法是:

    1 - 每次更新笔记时使用时间戳updatedAt 更新我的访问节点

    2 - 使用返回承诺的.once() 加载初始数据,请参见下面的代码。

    3 - 为访问节点更改时设置单独的订阅

    let myPromises = []
    database.ref(`user_notes/${uid}`).once('value', (myAccessSnaps) => {
      myAccessSnaps.forEach((accessSnap) => {
        const noteId = accessSnap.key
        const privateData = {'personalData': {...accessSnap.val()}}
        myPromises.push(
          database.ref(`notes/${noteId}`).once('value', (noteSnap)=>{
            const notData = noteSnap.val()
            const fullData = { ...privateData, ...notData }
            const note = {
              id: noteSnap.key,
              ...fullData
            }
            collectedNotes[note.id] = note
            ...
          })
        )
      }))
    })
    
    return Promise.all(myPromises)
    .then(() => {
      dispatch(setNotes(categories))
    ...
    // Set up subscription after initial load
    database.ref(`user_notes/${uid}`).on('value', (myAccessSnaps) => {
      ...
      // Use access node listener only - gets updated by 'updatedAt'
      database.ref(`notes/${noteId}`).once('value', (noteSnap)=>{
        //Collect and dispatch data
    

    亲切的问候 /K

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-02
      • 2023-01-16
      • 1970-01-01
      • 2020-12-06
      • 2018-08-02
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多