我的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
的数据库任何帮助,不胜感激!