1

Firebase クライアントは、次のようにタスクをキューに追加できます。

var tasks = db.ref('quote-request-queue/tasks');
tasks.push({'need': 'quote for customer'});

このタスクは、アイテムの価格見積もりを取得するためのリクエストを表します。

バックエンドでは、Firebase キュー ワーカーがタスクを取得して何らかの作業を行いますが、バックエンドの作業が完了したときにクライアントを更新する標準的な方法は何ですか?

クライアントが変更をリッスンするログイン ユーザー モデルのプロパティを使用する必要がありますか?

ログインしたユーザーは自分のモデルの変更をリッスンでき、変更時に見積もりデータを取得できますか?

ログインユーザーモデル自体以外に、DBで別のモデルを使用する可能性がありますか?

4

2 に答える 2

1

現在、キューの機能を使用して応答を処理することでこれを行っています。ユーザーは、セキュリティ ルールによってユーザー ID を要求のプロパティとして書き込むように強制され、自分の ID を含むキュー内のアイテムのみを読み取ることができます。

セキュリティ ルール (クライアントに関連する部分):

"queue": {
  "tasks": {
    ".indexOn": [
      "_state"
    ],
    "$id": {
      ".read": "auth !== null && ((!data.exists()) || (data.child('user').val() === auth.uid))",
      ".write": "auth !== null && ((!data.exists() && newData.child('user').val() === auth.uid && newData.child('_state').val() === '<start state goes here>') || (data.exists() && data.child('user').val() === auth.uid && !newData.exists()))"
    }
  }
}

これにより、クライアントは新しいジョブを作成したり、ジョブを削除したりできますが、その内容を変更することはできません。

<start state goes here>クライアントが開始状態でのみエントリを追加できるようにするには、上記のルールに入力する必要があります。

仕様

{
  "error_state" : "error",
  "finished_state" : "finished",
  "in_progress_state" : "in_progress"
}

クライアントが要求がいつ解決されるかを知るために監視する可能性がある終了状態を指定するには、デフォルト以外の仕様が必要です。

その他の考慮事項

クライアントは、このように使用されるタスクをクリーンアップすることに依存することはできません。タイムアウト後に応答を自動的に削除するようにサーバーを構成する必要があります。たとえば、ユーザーは、応答が返される前にページを更新したり、ページを離れたりする可能性があります。これが発生する確率は 1% 未満ですが、完了した応答でキューがいっぱいになると、パフォーマンスが低下します。

于 2016-10-24T20:45:41.223 に答える
1

タスクに一意の識別子を入れて、応答の「キュー」に書き込むことができます(その時点では、実際にはリストのようなものです)。

そう:

var tasks = db.ref('quote-request-queue/tasks');
var key = tasks.push().key;
tasks.push({'need': 'quote for customer', id: key });

そして、サーバーはその応答を次のように書き込みます。

quote-responses
    <key>

クライアントはそこで応答を待ちます。

var responses = db.ref('quote-responses').child(key);
responses.on('value', function(snapshot) {
    if (snapshot.exists()) {
        // TODO: handle the response in the snapshot
    }
});

参照: firebase-queue を使用してタスク結果を返す

于 2016-10-04T01:58:14.833 に答える