Firebase-queue:Firebaseのステロイド

Firebaseについて、オタクの雑誌に何度も書いた このシステムの主な利点は、場合によってはリアルタイムでデータを操作する完全なWebアプリケーションを構築できることです。 データベースへのアクセスのルールを編集する機能と、これらのルールをユーザー(ここにも持ってきた)に基づいて配置できるという事実を備えているため、原則として、バックエンドなしで実行できます。 ただし、通常は、ルールで自転車を製造するよりも「外部から」解決する方が適切な問題があります( )。



5月中旬、開発者はfirebase-queueのリリースを発表しました。 これは、タスクと同様に、データベース内のデータを使用して作業を整理できるjavascriptライブラリです。 次のように機能します。接続を確立するサーバーでQueue()を使用してタスクセルを定義します。 現在、このセルに新しい要素が表示されると、サーバーは必要なアクションを実行し、必要に応じて進行状況とエラーを通知し、完了時にタスクを削除します。 その結果、Firebaseの開発で発生する多くの問題をカバーする機会が得られます-データの調整、追加の検証(スパムやメイトの確認など)の実施、別の場所への送信(ホスティングへの写真のアップロードなど)など。



例として、stackoverflowから上記の質問を取り上げます。 n番目の要素数を持つオブジェクトがあります。 アイテムを追加/削除した後、合計数を更新します。 データベースでは、 要素長さの 2つのオブジェクトを定義します。 また、ルールで、 addnodeおよびrmnode タスクセルを指定します。 その中で、受信したいオブジェクトをクライアントから送信し、それに応じてelementsから削除します



var ref = new Firebase('https://***.firebaseio.com'); var addNode = function(text) { //  kriskowal/q   var deferred = Q.defer(); var task = ref.child('addnode').push({ new: text }, function(e) { if (e) { deferred.reject(e); } else { /*      .  progress()     _progress, resolve() -  . */ ref.child('addnode/'+task.key()).on('value', function(d) { var v = d.val(); if(v == null) { deferred.resolve(); } else { deferred.notify(v._progress); } }) }}); return deferred.promise; } var rmNode = function(k) { var deferred = Q.defer(); var task = ref.child('rmnode').push({ key: k }, function(e) { if (e) { deferred.reject(e); } else { ref.child('addnode/'+task.key()).on('value', function(d) { var v = d.val(); if(v == null) { deferred.resolve(); } else { deferred.notify(v._progress); } }) }}); return deferred.promise; }
      
      





Firebase-queueをタスクセルにアタッチします。 新しいタスクが表示されるとすぐに、サーバー上で必要な操作を既に実行します。

 var ref = new Firebase('https://***.firebaseio.com'); var length; ref.child('length').once('value', function(d) { length = d.val(); }); var addNodeQueue = new Queue(ref.child('addnode'), {}, function(data, progress, resolve, reject) { ref.child('elements').push(data.new, function(e) { if (e) { reject(e); } else { progress(50); length++; ref.child('length').set(length, function(e) { if (e) { reject(e.message); } else { resolve(); }}); }}); }); var rmNodeQueue = new Queue(ref.child('rmnode'), {}, function(data, progress, resolve, reject) { ref.child('elements/'+data.key).remove(function(e) { if (e) { reject(e); } else { progress(50); length--; ref.child('length').set(length, function(e) { if (e) { reject(e); } else { resolve(); }}); }}); });
      
      





ルールは次のとおりです。



 { "rules": { "addnode": { "$taskId": { "new": { ".validate": "newData.isString()" } } }, "rmnode": { "$taskId": { "key": { ".validate": "root.child('elements/'+newData.val()).exists()" //         } } } } }
      
      





記事の概要を過負荷にせず、保存しないために、 Queue()に指定できるタスク、タスク仕様、およびオプションのセキュリティルールに関する話を省略することにしました。 これは問題ありません(ドキュメントも同様)は、githubのプロジェクトページで説明されています。



All Articles