我想展示玩具清单。 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);
}
});
我构建了一个完整的工作代码集来说明我的问题: http://codepen.io/paganaye/pen/EWrayY
答案 0 :(得分:1)
使用玩具名称作为键,但首先通过firebase关键消毒剂运行,如:
word
您可以将原始名称保存为属性,就像使用push()方法一样,或者您可以使用decodeURIComponent()来反转编码以返回完全相同的字符串。
答案 1 :(得分: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>
&#13;