2017-04-01 128 views
0

我想显示一个玩具列表。 ach玩具作为一个独特的名字。 该名称可以包含任何字符,因此它可以有一个斜线或一个美元。 这就是为什么我更愿意使用push方法来获取生成的密钥。Firebase数据收集与唯一成员

我最终的代码很麻烦。 它不是线程安全的,我最终可能会有重复的玩具。 有没有更好的方法?

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); 
    } 
}); 

我建codepen这里说明我的问题,一个完整的工作: http://codepen.io/paganaye/pen/EWrayY

回答

1

使用玩具的名称作为关键,但第一次运行它通过火力键消毒剂,如:

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

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

+0

我听到你说什么。 虽然你的函数确实代替了太多的字符。 怎么样: function fbKeySanitizer(str){ return str.replace(/[%.$[\]#\/]/ g,function(c){''''')'c.charCodeAt(0) .toString(16).toUpperCase(); }); } –

+1

这可能会工作,但是URL安全至少在我的情况下是方便的。一旦你选择一个编码,坚持下去。如果开始编码的方式不同,即使无损往返,查找也会失败。 – Mike

+0

我认为你的正则表达式被破坏了,但是你需要在第一个方括号中进行转义。 ''%。$ []#/“。replace(/[%.$[]#\/]/ g,'*')'=>'”%。$ []#/“'但是'”%。 $ []#/“。replace(/[%.$[\]#\/]/ g,'*')'=>''*******”' – Mike

0

这是使用Unicode字符的替代解决方案。 例如,#字符被替换为非常相似的符号和倾斜的并行符号:'⧣'。

var nameElt = document.getElementById("name"); 
 
var sanitizedElt = document.getElementById("sanitized"); 
 
var sanitized2Elt = document.getElementById("sanitized2"); 
 
var decodedElt = document.getElementById("decoded"); 
 
var outpuElt = document.getElementById("output"); 
 
var decoded2Elt = document.getElementById("decoded2"); 
 

 

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

 
var unicodeReplacements = { 
 
    '.':'․', // One dot leader 
 
    '$':'ᙚ', // Canadian syllabics carrier: sh 
 
    '[':'⟦', // Mathematical left white square bracket 
 
    ']':'⟧', // Mathematical right white square bracket 
 
    '#':'⧣', // Equals sign and slanted parallel 
 
    '/':'⧸' // big solidus 
 
} 
 
var decodeUnicodeReplacements = {}; 
 
for (var prop in unicodeReplacements) { 
 
    decodeUnicodeReplacements[unicodeReplacements[prop]]=prop; 
 
} 
 

 
function fbKeySanitizer2(str) { 
 
    return str.replace(/[.$[\]#\/]/g, function (c) { 
 
    return unicodeReplacements[c]; 
 
    }); 
 
} 
 

 
function fbDecoded2(str) { 
 
    return str.replace(/[․ᙚ⟦⟧⧣⧸]/g, function (c) { 
 
    return decodeUnicodeReplacements[c]; 
 
    }); 
 
} 
 

 
function nameKeyUp() { 
 
    var sanitized1string = fbKeySanitizer(nameElt.value); 
 
    sanitizedElt.innerText = sanitized1string; 
 
    decodedElt.innerText = decodeURIComponent(sanitized1string); 
 

 
    var sanitized2string = fbKeySanitizer2(nameElt.value); 
 
    sanitized2Elt.innerText = sanitized2string; 
 
    decoded2Elt.innerText = fbDecoded2(sanitized2string); 
 
} 
 
nameKeyUp();
<script src="https://www.gstatic.com/firebasejs/3.6.1/firebase.js"></script> 
 
<form> 
 
    <h1>Firebase invalid key characters escaping</h1> 
 
    <label for="name">name:</label> 
 
    <input id="name" onkeyup="nameKeyUp()" value="A%.B[#0]/x" /> 
 
    <hr> 
 
    <form> 
 
    <h3>Method One</h3> 
 
    <p>Sanitized1: <span id="sanitized"></span></p> 
 
    <p>Decoded1: <span id="decoded"></span></p> 
 
    <hr> 
 
    <h3>Method Two</h3> 
 
    <p>Sanitized2: <span id="sanitized2"></span></p> 
 
    <p>Decoded2: <span id="decoded2"></span></p> 
 
</form>

+1

有趣的想法:优点:将它粘贴到控制台的URL中会更容易。缺点:任何字符编码错误都会给你带来ascii汤,我无法从键盘输入这些字符,这些字符不再是字符可用,你留下了一个unicode的子集 – Mike

+0

同意。 我开始使用ascii的一个子集,并且最终得到了一个unicode子集。 –

+0

不是真的,为了实现往返URI编码,可以将任何unicode加入并返回完全相同的字符串。尝试编码,然后用你的函数解码下面的字符串:'“。$ [\]#\ /]。”看看你回来了什么。 URI编码/解码是无损的。 – Mike