具有唯一成员的 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>