angularjs firebase onAuthStateChanged注销数据库错误

时间:2017-01-30 00:24:47

标签: angularjs firebase firebase-realtime-database firebase-authentication

当我退出应用程序时,我收到此错误:

Error: permission_denied at /users/KuehJHDJ15SfS1s6FIh1: Client doesn't have permission to access the desired data.

 at G (firebase.js:432)
    at Object.G (firebase.js:456)
    at Pg (firebase.js:398)
    at Eg.g.wd (firebase.js:391)
    at sg.wd (firebase.js:381)
    at bg.hg (firebase.js:379)
    at eg (firebase.js:363)
    at WebSocket.La.onmessage (firebase.js:362)

我怀疑我的问题与此非常相关: Refs not rerunning after onAuthStateChanged changes Firebase 3.0.0

这是我的安全规则:

{
  "rules": {
    "users": {
      ".read": "auth != null && root.child('hashlist/'+root.child('users/'+auth.uid+'/hash').val()).val() == auth.email",
      ".write": "auth != null"
    },
    "hashlist": {
      ".read": true,
      ".write": "auth != null && root.child('users/'+auth.uid+'/role').val() == 'admin'"

    }
  }
}

感谢您的帮助,谢谢。

1 个答案:

答案 0 :(得分:3)

引发错误是因为在注销发生后,refs会继续侦听更改,并且一旦注销,安全规则就会阻止它们这样做。

为防止出现这些错误,您需要在退出之前拨打任何正在侦听的裁判off

这样做没有自动化设施;这是你必须自己管理的事情。你应该:

  • 当不再需要时,使用$scope.$on("$destroy", ...)关闭范围内的侦听引用(自从我使用Angular JS已经很长时间了,所以我的内存在这里可能有点不可靠)。
  • 在您只需要读取一次值的情况下,确保不要使用once留下悬空的听众。
  • 考虑使用AngularFire,它为对象和数组提供了一些很好的绑定,并自行连接(如果我没记错的话),以便在范围被破坏时关闭其内部侦听引用。