Firebase实时数据库订阅.on()不会在客户端上触发

时间:2019-09-16 10:04:13

标签: javascript firebase firebase-realtime-database

我的Firebase实时数据库中有一组笔记。 我的代码设置为订阅数据库的 / notes 路径中的修改。 在Firebase Web控制台中更新笔记时,我的客户端会获取更新,但是另一个客户端通过ref.update()更新笔记时,数据不会推送到我的客户端。

在Firebase Web控制台中进行更新时,我正在从一个浏览器执行更新,并在另一个浏览器中观看更新。

怎么可能?参见下面的代码。

export const startSubscribeNotes = () => {
  return (dispatch, getState) => {
    const uid = getState().auth.uid
    const dbPath = 'notes'

    database.ref(`${dbPath}`)
    .orderByChild(`access/members/${uid}`)
    .equalTo(true)
    .on('value', (snapshot) => {
      console.log('notes .on()')
      let updatednotes = []
      console.log('Existing notes', existingnotes)
      snapshot.forEach( (data) => {
        const note = {
          id: data.key,
          ...data.val()
        }
        updatednotes.push(note)
      })
      dispatch(setnotes(notes))
    })
  }
}

我注意到的是,如果我在Firebase数据库中更改访问规则,则可以获取更新,但不再限制读取访问。

  "notes": {
    //entry-level access
  ".read": "
    auth.uid !== null //&& query.equalTo === auth.uid
  ",

然后,我可以循环所有笔记并收集那些我只能阅读的笔记。

const uid = getState().auth.uid
database.ref('notes')
.on('value', (snapshot) => {
  const notes = []
  snapshot.forEach((data) => {
    const noteData = data.val()
    if(noteData.access){
      const authorArray = (noteData.access.author) ? [noteData.access.author] : []
      const members = (noteData.access.members) ? noteData.access.members : {}
      const membersArray = Object.keys(members)
      const allUsers = authorArray.concat(membersArray)
      const accessGranted = allUsers.includes(uid)
      if(accessGranted){
        const note = {
          id: data.key,
          ...data.val()
        }
        notes.push(note)
      }
    }
  })
  if(notes.length > 0){ dispatch(setNotes(notes)) } //Dispatch if not empty
})

如何应用访问规则并仍将更新推送到客户端? 我检查了所有客户端都可以写到 / notes

的数据库

任何帮助,不胜感激!

0 个答案:

没有答案
相关问题