我正在使用带有Torii的EmberFire进行会话。当我将用户注销时,我遇到一个奇怪的问题,并且在控制台中抛出以下错误:
firebase.js:186 Error: permission_denied at /folders/-KKvrk3K_JOHxQWgR1km: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /folders/-KLFp3zh5QUB7KvMF0HZ: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /externalApps/-KLF_wKXtzm38EHtuQ_C: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /users/-KLKUOZRBCIeCj44WMe7: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /externalApps/-KLIyXUwTSrkCIL4rz7U: Client doesn't have permission to access the desired data.
我登录用户有两个地方:
注册时
register(data) {
return this.get('firebaseApp')
.auth()
.createUserWithEmailAndPassword(data.email, data.password)
.then((registeredUser) => {
const newUser = this.store.createRecord('user', {
uid: registeredUser.uid,
firstName: data.firstName,
lastName: data.lastName,
email: registeredUser.email
})
return newUser.save();
})
.then((savedUser) => {
return this.get('session').fetch().then(() => {
return savedUser;
});
})
.then((savedUser) => {
this.replaceWith('dashboard');
});
}
对于已注册的用户
login(email, password) {
const controller = this.controllerFor('index');
this.get('session').open('firebase', {
provider: 'password',
email: email,
password: password
})
.then((/* response */) => {
controller.set('loginError', undefined);
this.replaceWith('dashboard');
})
.catch((error) => {
controller.set('loginError', error);
});
}
以下是记录用户的操作:
logout() {
this.get('session').close().then(() => {
this.store.unloadAll();
this.replaceWith('index');
});
}
答案 0 :(得分:4)
一周前我遇到了同样的问题。似乎Emberfire在Ember Data扩展中实现的方式不允许使用store.unloadAll()
我打开了一个问题here,但没有看到团队的任何回复。
您可以通过直接从商店卸载用户轻松解决此问题。只要您使用store.unloadRecord(<specificRecord>)
或<specificRecord.unload()
,那么一切正常。
在您的情况下,您可以在登录或注册新用户时保存用户记录,然后在注销时卸载该记录。如果所有这些操作都不在同一个控制器中,您可能必须创建一个服务来处理该交互。
希望有所帮助
答案 1 :(得分:1)
2年后错误仍然存在:) 因此,真正快速又肮脏的解决方案可以避免控制台中的错误。关于this的评论,“ emberfire在加载后永远不会停止监听任何记录”。因此,要与Firebase服务器“断开连接”,我们可以简单地打开(没有加载完整的app [= page])页面,而无需任何emberdata元素。 所以我的解决方案(无论应用程序中的哪个宫殿):
actions: {
signOut: function () {
window.location.replace('/login');
}
}
在登录路径上:
beforeModel(){
if (this.get('session').get('isAuthenticated')) {
this.get('session').close()
}
}
有关我的设置的一些信息:
调试:Ember:3.1.3
调试:Ember数据:3.1.1
调试:Firebase:3.9.0
调试:EmberFire:2.0.10
调试:jQuery:3.3.1
希望这将有助于避免页面上的错误。如果应用真的很大,也许是个坏主意。
答案 2 :(得分:0)
@Paul回答的关键是:
actions: {
signOut: function () {
window.location.replace('/login');
}
}
如果您使用的是Emberfire和Torii提供程序,则需要重新获取会话才能关闭它。这就是我在sign-out
路线中所做的...
export default Route.extend({
session: inject(),
redirect() {
get(this, 'session')
.fetch()
.then(async () => {
await get(this, 'session').close();
this.transitionTo('/sign-in');
});
},
setupController(controller, model) {
this._super(controller, model);
}
});
我在此路由中设置了一个控制器,以便在应用程序获取会话时可以显示加载微调框。