Javascript 具有唯一成员的Firebase数据收集

Javascript 具有唯一成员的Firebase数据收集,javascript,firebase,firebase-realtime-database,unique-index,Javascript,Firebase,Firebase Realtime Database,Unique Index,我想展示一份玩具清单。 ach玩具作为一个唯一的名称。 名称可以包含任何字符,因此可以有点、斜杠或美元。 这就是为什么我更喜欢使用push方法来获取生成的密钥 我最终得到的代码很麻烦。 它不是线程安全的,我可能会以复制玩具结束。 有更好的办法吗 var child = testsRef.orderByChild("name").equalTo("Meccano"); return child.once('value').then(function(snapshot) { var snap

我想展示一份玩具清单。 ach玩具作为一个唯一的名称。 名称可以包含任何字符,因此可以有点、斜杠或美元。 这就是为什么我更喜欢使用push方法来获取生成的密钥

我最终得到的代码很麻烦。 它不是线程安全的,我可能会以复制玩具结束。 有更好的办法吗

var child = testsRef.orderByChild("name").equalTo("Meccano");

return child.once('value').then(function(snapshot) {
  var snap = snapshot.val();
  if (snapshot.val()) {
    alert('Toy ' + value + ' already exists.');
  } else {
    var newPostKey = testsRef.push().key;
    var updates = {};
    updates[newPostKey] = {          name: value        };
    var result = testsRef.update(updates);
    alert('We can only assume that it has worked.' + result);
  }
});
我构建了一个完整的工作代码笔来说明我的问题:

使用玩具名称作为钥匙,但首先使用firebase钥匙消毒剂,如:

function fbKeySanitizer(str) {
  return encodeURIComponent(str).replace(/[.$[\]#\/]/g, function (c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase();
  });
}

您可以像使用push方法一样将原始名称保存为属性,也可以使用decodeURIComponent反转编码以返回完全相同的字符串。

这是使用Unicode字符的替代解决方案。 例如,该字符被一个非常相似的等号替换,并倾斜平行:'⧣'.

var nameElt=document.getElementByIdname; var sanitizedElt=document.getElementByIdsanitized; var sanitized2Elt=document.getElementByIdsanitized2; var decodedElt=document.getElementByIddecoded; var outpuElt=document.getElementByIdoutput; var decoded2Elt=document.getElementByIddecoded2; 函数FBKEYSANIZERSTR{ 返回str.replace/[%.$[\]\/]/g,函数c{ 返回“%”c.charCodeAt0.toString 16.toUpperCase; }; } var unicodeReplacements={ “:”——“,//一个点引线 '$':'ᙚ', // 加拿大音节载体:sh '[':'⟦', // 数学左白方括号 ']':'⟧', // 右白方括号 :'⧣', // 等号和倾斜平行 '/':'⧸' // 大索利多金币 } var-decodeUnicodePlacements={}; 对于Unicodereplacement中的var prop{ decodeUnicodeReplacements[unicodeReplacements[prop]]=prop; } 函数fbkeysanizer2str{ 返回str.replace/[.$[\]\/]/g,函数c{ 退货和退换货[c]; }; } 函数fbd2str{ 返回str.replace/[․ᙚ⟦⟧⧣⧸]/g、 功能c{ 返回/取消安置[c]; }; } 函数名keyUp{ var sanitized1string=FBKEYSANITIERNAMEELT.value; sanitizedElt.innerText=sanitized1string; decodedElt.innerText=decodeURIComponentsanitized1string; var sanitized2string=FBKEYSANTIZER2NAMELT.value; sanitized2Elt.innerText=sanitized2string; decoded2Elt.innerText=FBdecoded2sanitized2字符串; } 名称键控; Firebase无效密钥字符转义 姓名: 方法一 消毒1:

解码1:

方法二 消毒2:

解码2:


我听到你说的了。不过,你的函数确实替换了太多的字符。关于:函数fbkeysanizizerstr{return str.replace/[%.$[]\/]/g,函数c{return%'+c.charCodeAt0.toString16.toUpperCase;};}这可能会起作用,但至少在我的情况下,URL安全是方便的。一旦你选择了一种编码,就坚持它。如果你开始以不同的方式编码,即使它们是无损的往返,查找也会失败。我认为你的regexp被破坏了,你需要在第一个封闭的方括号中进行转义。%.$[]/.replace/[%.$[]\//g,'*'=>%.$[]/但是%.$[]/.replace/[%.$[\]\/]/g,'*'=>*******谢谢你。不过我确实在括号前放了斜杠。看起来注释编辑器把它去掉了。函数fbkeysanizizertr{return str.replace/[%.$[\]\/]/g,函数c{return return%'+c.charCodeAt0.toString16.toUpperCase;};}有趣的想法:优点:在控制台中粘贴到URL会容易得多缺点:任何字符编码错误都会给你留下ascii汤,我无法从键盘键入这些字符,这些字符不再可用,你只剩下unicode的子集。我从ascii的子集开始,最后得到unicode的子集。不是吗实际上,出于往返的目的,URI编码可以接受任何unicode并返回到完全相同的字符串。请尝试编码以下字符串,然后使用函数对其进行解码:.$[\]\/]\8228;ᙚ⟦⟧⧣⧸ 看看你能得到什么。URI编码/解码是无损的。我的意思是。使用firebase您不能使用:'.$[]/'使用我的功能有点不正常,您不能使用:'--ᙚ⟦⟧⧣⧸' 这对我们中的一些人来说可能已经足够了。