这是一个非常简单的问题。我有一个查找位置,我存储是否已使用用户名。格式是用户名:userid,当我不想保持我的数据库干净但它确实很好。为了阻止它不断增长,我添加了它 - 它可以工作,但感觉就像一个非常黑客的方法。
this.db.database.ref('usernames').on('child_added',snapshot => {
if (snapshot.val() === userId && snapshot.key !== username) {
this.db.object(`usernames/${snapshot.key}`).remove();
}
});
它可以正常工作我想要它做但如果你知道我的意思,感觉非常“非常”。
必须有一种更好的方法来删除所有键的记录!== new_key和value === $ uid。
答案 0 :(得分:1)
我想我明白你在做什么。您有一个名为" usernames"的数据库分支,您可以在其中拥有键值对列表。键是用户名,由用户组成的简短易记的名称,例如" bob1"或者" darthVader111"。对于每个值,该值是用户的Firebase UserId,这是长期不可记录的代码,例如" 4jkh53kjh543g3ij4534k5j43h5k"。
database
usernames
bob1 (key): 4jkh53kjh543g3ij4534k5j43h5k (value)
darthvader (key): 098769456435k6645kjhlsdfkjh (value)
...
您的代码正在等待对数据库的用户名分支的任何添加,并查看添加的键值对。如果您当前以Firebase UserID" 4jkh53kjh543g3ij4534k5j43h5k"登录,并且您的用户名为" bob1",则代码会看到添加了一个新的子项,其用户名为" Roberto&# 34;,使用相同的Firebase UserID" 4jkh53kjh543g3ij4534k5j43h5k",然后它知道用户(其Firebase用户ID是常量)必须更改他/她的用户名。
因此删除(旧的)用户名条目是合理的,{" bob1":" 4jkh53kjh543g3ij4534k5j43h5k"}。
我认为它很巧妙,因为它不需要搜索。但是,它不是更整洁,不必等待" child_added",而是在创建新用户名条目的代码中执行此操作?例如:
let userObject={};
userObject[newUserName]=userId;
this.db.object(`usernames/${oldUserName}`).remove()
.then(this.db.object("usernames").update(userObject))
看起来你让最终用户在他/她喜欢的任何地方有效地写入usernames
树。您可以使用firebase服务器上的验证规则使其更安全。
特别是,您可能希望阻止最终用户(可能能够操纵javascript以删除" .remove()"调用)接管大量用户ID
这方面的一个解决方案是拥有两个username
数据库:其中一个是密码完成的,用户名:userId,另一个是userId:username。您可以设置更新必须
这样,如果用户删除" .remove()"在javascript中调用,他/她将无法接管新的userId。