每当用户登录时,我都会运行此命令以将其数据保存在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();
之后仍然保持与用户的连接,并且直到路由器正在导航,他仍在尝试刷新数据。这就是为什么我只需要执行一次这个动作。
答案 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
希望还有帮助!