Angularfire2读取数据一次

时间:2016-10-18 10:01:34

标签: angular firebase firebase-realtime-database angularfire2

每当用户登录时,我都会运行此命令以将其数据保存在users节点中。不幸的是,每当用户退出时我都会收到此错误:

FIREBASE WARNING: Exception was thrown by user callback. Error: permission_denied at /users/userID: Client doesn't have permission to access the desired data.
    at Error (native)
    at G (http://localhost:4200/main.bundle.js:75367:36)
    at Object.G (http://localhost:4200/main.bundle.js:75371:86)
    at yh (http://localhost:4200/main.bundle.js:75356:98)
    at nh.h.wd (http://localhost:4200/main.bundle.js:75349:310)
    at af.wd (http://localhost:4200/main.bundle.js:75252:364)
    at vd.hg (http://localhost:4200/main.bundle.js:75250:280)
    at yd (http://localhost:4200/main.bundle.js:75203:464)
    at WebSocket.La.onmessage (http://localhost:4200/main.bundle.js:75202:245)
    at WebSocket.wrapFn [as _onmessage] (http://localhost:4200/main.bundle.js:94097:29) 

这意味着Firebase会一直监听我的用户,直到重定向该页面。所以我需要尝试只运行一次。任何想法?

在用户面板中,我有以下代码:

ngOnInit() {
        this.authService.loadUser().subscribe(() => {
            this.user = this.authService.userData;
        });
  }

这是指我的loadUser()方法从firebase获取数据(我只是尝试放置take(1)但我仍然得到此权限错误):

loadUser() {
      return this.af.database.object('/users/'+this.uid).take(1).map(user => {
            this.userData = user;
        });
  }

在我的退出中,我只是这样做:

logout() {
      this.auth.logout();
      this.userData = null;
    this.isLoggedIn = false;
    this.router.navigate(['']);
  }

我认为发生错误是因为firebase即使在this.auth.logout();之后仍然保持与用户的连接,并且直到路由器正在导航,他仍在尝试刷新数据。这就是为什么我只需要执行一次这个动作。

2 个答案:

答案 0 :(得分:1)

我之前也遇到过这个问题。这是因为在注销后正在发生数据同步调用。我的解决方案是在使用goOffline()的注销例程期间断开与firebase的连接,并且它将阻止通过websockets 然后进行任何进一步的数据同步。

logout () {
  firebase.database().goOffline();
  // other log out code
}

重要提示:如果您在注销时致电goOffline(),如果您打算再次登录,则必须致电goOnline()。我建议您每次登录时都拨打goOnline()

答案 1 :(得分:1)

我也有同样的问题。我对Observables比较陌生,所以如果我的解释不正确,我会道歉。

我认为问题是您订阅了AngularFire public function index(SS_HTTPRequest $request) { $properties = Property::get(); if($pool= $request->getVar('pool')) { $properties= $properties ->filter(array( 'Title' => 'pool' )); } if($garage= $request->getVar('garage')) { $properties= $properties ->filter(array( 'Title' => 'garage' )); } return array ( 'Results' => $properties ); } 函数返回的FirebaseObjectObservable,因此即使您注销,数据仍会尝试保持同步。

我的解决方案是在退出之前取消订阅,因此您的object()功能将如下所示:

logout

希望还有帮助!