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

时间:2017-04-01 14:08:27

标签: 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 = 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

2 个答案:

答案 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;
&#13;
&#13;