在firebase密钥中替换无效字符的好方法?

irt*_*rth 26 firebase

我的用例是保存用户的信息.当我尝试使用用户的电子邮件地址作为密钥将数据保存到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)

  • 欣赏周到的jay,但这实际上是我试图通过直接查找索引来避免.这样就无需等待任何事情,我们将在没有任何明显打嗝的情况下进行扩展. (2认同)