我的用例是保存用户的信息.当我尝试使用用户的电子邮件地址作为密钥将数据保存到Firebase时,Firebase会抛出以下错误:
错误:密钥e@e.ee无效(不能包含
.$[]#)
所以,显然,我不能通过他们的电子邮件索引用户信息.更换的最佳做法是.什么?
我已经成功地将其更改.为a -但不会削减它,因为有些电子邮件已经-在地址中.
目前,我正在使用
var cleanEmail = email.replace('.','`');
Run Code Online (Sandbox Code Playgroud)
但有可能会出现与此相关的冲突.
Mow*_*zer 22
在电子邮件地址中,用.逗号替换点,.这种模式是最佳实践.
逗号,是不是在电子邮件地址中允许的字符,但它是在一个火力地堡键允许的.相应的,点. 是电子邮件地址中允许的字符,但它是不是在火力地堡键允许的.因此,直接替代将解决您的问题.您可以索引电子邮件地址而无需循环.
你还有另一个问题.在你的代码中:
const cleanEmail = email.replace('.',','); // only replaces first dot
Run Code Online (Sandbox Code Playgroud)
只会替换第一个点.但电子邮件地址可以有多个点.要替换所有点,请使用正则表达式.
const cleanEmail = email.replace(/\./g, ','); // replaces all dots
Run Code Online (Sandbox Code Playgroud)
Jay*_*Jay 10
我们已经多次处理过这个问题,而表面上似乎使用电子邮件作为关键是一个简单的解决方案,它会导致很多其他问题:必须清理/解析电子邮件以便实际使用它.如果电子邮件更改怎么办?
我们发现改变数据存储方式的格式是一条更好的路径.假设您只需要存储一个用户名.
john@somecompany.com: "John Smith"
Run Code Online (Sandbox Code Playgroud)
改变它
randomly_generated_node_name
email: "john@somecompany.com"
first: "John"
last: "Smith"
Run Code Online (Sandbox Code Playgroud)
random_generated_node_name是Firebase可以通过childByAutoId生成的字符串,或者实际上与数据没有直接关联的任何类型的引用.
这提供了很大的灵活性:你现在可以改变姓氏 - 比如他们结婚了.或者更改电子邮件.您可以添加可用于排序的"索引"子0,1,2等.可以查询任何子数据的数据.全部因为random_generated_node_name是对节点内变量子数据的静态引用.
它还允许您在将来扩展数据而不更改现有数据.添加地址,最喜欢的食物,分类索引等.
编辑:ObjC中的电子邮件Firebase查询:
//references all of the users ordered by email
FQuery *allUsers = [myUsersRef queryOrderedByChild:@"email"];
//ref the user with this email
FQuery *thisSpecificUser = [allUsers queryEqualToValue:@“john@somecompany.com”];
//load the user with this email
[thisSpecificUser observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with this user
}];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8428 次 |
| 最近记录: |