具有唯一成员的 Firebase 数据收集
Firebase Data Collection with Unique Member
我想显示一份玩具清单。
ach toy 作为一个独特的名字。
该名称可以包含任何字符,因此它可以包含一个点、一个斜杠或一个美元。
这就是为什么我更愿意使用 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
使用玩具名称作为密钥,但首先 运行 通过 firebase 密钥消毒程序,例如:
function fbKeySanitizer(str) {
return encodeURIComponent(str).replace(/[.$[\]#\/]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
});
}
您可以像使用 push() 方法一样将原始名称保存为 属性,或者您可以使用 decodeURIComponent() 反转编码以返回完全相同的字符串。
这是使用 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>
我想显示一份玩具清单。 ach toy 作为一个独特的名字。 该名称可以包含任何字符,因此它可以包含一个点、一个斜杠或一个美元。 这就是为什么我更愿意使用 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
使用玩具名称作为密钥,但首先 运行 通过 firebase 密钥消毒程序,例如:
function fbKeySanitizer(str) {
return encodeURIComponent(str).replace(/[.$[\]#\/]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
});
}
您可以像使用 push() 方法一样将原始名称保存为 属性,或者您可以使用 decodeURIComponent() 反转编码以返回完全相同的字符串。
这是使用 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>