2017-04-01 5 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

キーとしておもちゃの名前を使用しますが、最初のような消毒剤firebaseキーを通してそれを実行します。

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

push()メソッドの場合と同じように元の名前をプロパティとして保存するか、decodeURIComponent()を使用してエンコードを元に戻して、まったく同じ文字列に戻すことができます。

+0

。 あなたの関数は、はるかに多くの文字を置き換えます。 約 ファンクションfbKeySanitizer(str){ return str.replace(/[%.$[¥]#//]/g、function(c){ return '%' + c.charCodeAt(0) .toString(16).toUpperCase(); }); } –

+1

これはおそらく動作しますが、URLの安全性は少なくとも私の状況では便利です。エンコーディングを選択したら、それに固執してください。ラウンドトリップが無損失であっても、エンコーディングを異なる方法で開始すると、ルックアップが失敗します。 – Mike

+0

あなたの正規表現は壊れていると思いますが、最初の大括弧ではエスケープが必要です。 ''%。$ []#/ "'%。$ []#/ "。 $ []#/ "。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

興味深いアイデア:pros:コンソールの短所にURLを貼り付けるほうがはるかに簡単です:文字エンコードの間違いがあればアスキースープが残ってしまいます。キーボードから文字を入力することはできません。利用可能な場合は、ユニコードのサブセットが残っています – Mike

+0

同意します。 私はasciiのサブセットで始まり、私はユニコードのサブセットで終わります。 –

+0

本当に、ラウンドトリップの目的のために、URIエンコーディングはユニコードを取り込み、まったく同じ文字列に戻ることができます。 ''。$ [\]#\ /]。ᙚ⟦⟧⧣⧸ "'という文字列をエンコーディングして解読し、あなたが戻ってくるものを見てください。 URIのエンコード/デコードはロスレスです。 – Mike

関連する問題