asynchronous - Ionic 4 存储移除
问题描述
我的 Ionic 应用程序中有一个凭证令牌存储,要执行注销操作,我需要删除存储在其中的令牌。这是我的登录服务:
// imports skipped;
export class LoginService implements CanActivate {
private authToken: string;
private httpService: string;
constructor(
private handler: HttpBackend,
private router: Router,
private storage: Storage
) {
this.httpService = new HttpClient(handler);
}
private generateToken(login: string, password: string) {
return btoa(`${login}:${password}`);
}
authenticate(login: string, password: string, webserviceURL: string) {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
Authorization: `Basic ${this.generateToken(login, password)}`
})
};
return this.httpClient.get(`http://${webserviceURL}/api/version/`, httpOptions);
}
async saveToken(login: string, password: string) {
this.authToken = this.generateToken(login, password);
return await this.storage.set('AUTH_TOKEN', this.authToken);
}
async getToken() {
return await this.storage.get('AUTH_TOKEN');
}
async clearData() {
this.authToken = null;
return await this.storage.remove('AUTH_TOKEN');
}
canActivate() {
if (this.authToken) {
return true;
}
this.router.navigateByUrl('login');
}
}
在我对这项服务的测试中,我得到了以下信息:
const expectedToken = btoa('testLogin:testPassword');
service.saveToken('testLogin', 'testPassword').then(() => {
service.getToken().then(savedToken => {
expect(savedToken).toEqual(expectedToken);
});
});
service.clearData().then(() => {
service.getToken().then(savedToken => {
expect(savedToken).toBe(null);
});
});
因此,每当我运行测试时,最后一个测试用例都会失败,因为由于某种原因,令牌没有从存储中删除。这是测试输出:Error: Expected 'dGVzdExvZ2luOnRlc3RQYXNzd29yZA==' to be null
. 我应该如何正确处理从存储中删除值?
解决方案
我自己没有尝试过,但我希望类似以下的东西可以工作:
this.storage.set('AUTH_TOKEN', null);
或者
// Actually use a variation of this one myself for one case
this.storage.set('AUTH_TOKEN', '');
编辑:这两个都是如果您需要将密钥保存在本地存储中。即-您的应用程序希望密钥始终存在-无论状态如何。
推荐阅读
- flutter - 我什么时候应该让应用程序崩溃?
- c - 在 windows 中安装 GTK 错误
- php - 更新表格价格时四舍五入到最接近的 10 倍数
- amazon-web-services - 我的 Docker 容器在 AWS EC2 Ubuntu 实例上运行。当我转到公共 IPv4 DNS 时,我的浏览器显示“拒绝连接”。
- vue.js - 如何声明自定义复数规则 vue-i18n Vue 3?
- c++ - 使用类名作为基于模板类的类成员的参数?
- reactjs - 渲染方法应该是 props 和 state 更新状态时错误的纯函数
- crystal-reports - 在水晶报表中需要帮助-“字段无法汇总”
- python - 如何使用 BERT 解决地址匹配问题?
- java - 连接 com.mysql.cj.jdbc.ConnectionImpl@ee48bb3 因 SQLSTATE(08S01)、ErrorCode(0) 标记为损坏