Javascript Firebase';价值';即使由于安全规则不允许写入操作,也会触发事件

Javascript Firebase';价值';即使由于安全规则不允许写入操作,也会触发事件,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我的firebase数据库中有一个报警分支,如果生成的报警包含一些字段或报警被删除,则允许写入。安全规则如下所示 "alarms": { "$alarmId": { ".write": "auth !== null && (newData.hasChildren(['id', 'name', 'date', 'status']) || !newData.exists())" }, ".indexOn":

我的firebase数据库中有一个
报警
分支,如果生成的报警包含一些字段或报警被删除,则允许写入。安全规则如下所示

    "alarms": {
        "$alarmId": {
          ".write": "auth !== null && (newData.hasChildren(['id', 'name', 'date', 'status']) || !newData.exists())"
        },
        ".indexOn": "name"
    }
在某些情况下,我可能会删除警报,然后在删除完成后立即尝试执行一些更新,但不会详细介绍实际的工作流程。这是在处理用户脱机时排队的某些操作时完成的。不允许在删除后执行更新,因为生成的数据不包含
write
规则中提到的必填字段。下面是一段模拟我所做工作的代码

      GlobalConfig.rootFirebaseRef.child('alarms').child('test').on('value', (snapshot) => {
        console.tron.log('Detected a change at test alarm ' + JSON.stringify(snapshot.val() || {}))
      })
      GlobalConfig.rootFirebaseRef.child('alarms').child('test').set({name: 'blah', id: 'blah', status: true, date: Date.now()}).then(() => {
        console.tron.log('Finished set')
        let firebaseUpdate = {}
        firebaseUpdate['alarms/test'] = null;
        return GlobalConfig.rootFirebaseRef.update(firebaseUpdate)
      }).then(() => {
        console.tron.log('Finished delete')
        let firebaseUpdateObj = {}
        const currDate = Date.now()
        firebaseUpdateObj['alarms/' + 'test' + '/lastSnoozeByCreatorOn'] = currDate
        firebaseUpdateObj['alarms/' + 'test' + '/lastSnoozeByCreatorFor'] = 120
        firebaseUpdateObj['alarms/' + 'test' + '/lastUpdatedAt'] = currDate
        return GlobalConfig.rootFirebaseRef.update(firebaseUpdateObj)
      }).catch(error => {
        console.tron.log('push error ' + JSON.stringify(error))
      })
如您所见,我正在推送一个新的虚拟报警,然后删除它,然后执行部分更新。下面是控制台日志语句

Detected a change at test alarm {"date":1499488553686,"id":"blah","name":"blah","status":true}
Finished set
Detected a change at test alarm {}
Finished delete
Detected a change at test alarm {"lastSnoozeByCreatorFor":120,"lastSnoozeByCreatorOn":1499488556766,"lastUpdatedAt":1499488556766}
FIREBASE WARNING: update at / failed: permission_denied 
Detected a change at test alarm {}
push error {"line":68548,"column":89,"sourceURL":"http://localhost:8081/index.ios.bundle?platform=ios&dev=true&minify=false","code":"PERMISSION_DENIED"}
从控制台日志中可以明显看出,删除后写入是不允许的,但是
事件处理程序仍然会在部分更新时触发


这是预期的行为吗?

当权限失败时,侦听器在初始更新时启动,然后在更新被拒绝时再次启动。看看这个答案:还有这个。谢谢@BobSnyder。对于一个新用户来说,我有点意外,但在阅读了这篇博文后,我理解了它背后的动机。