firebase
Firebase Queue
サーチ…
アプリケーションのバックエンドとしてfirebase queueを使用する方法
Firebaseはバックエンドをサービスとして提供しますが、アプリケーション開発者はバックエンドコードを持つオプションがありません。
この例では、firebaseキューを使用してfirebaseデータベースの一番上で動作し、フロントエンドアプリケーションのバックエンドとして機能するバックエンドを作成する方法を示します。
コードに入る前に、アーキテクチャがどのように機能するのか理解できます。簡潔にするために、Webサイトをフロントエンドとして、NodeJsサーバーをバックエンドとして使用しているとします
前提条件
あなたのGoogleアカウントを使ってfirebaseアプリケーションを作成する
あなたのウェブページにfirebaseを追加してください。
bower install firebase --save
使用bower install firebase --save
新しい作成されたfirebaseアカウントを使用してサービスアカウントを作成します(設定 - >権限 - >サービスアカウント - >サービスアカウントの作成 - >名前を指定して「新しい秘密鍵を提供する」チェックボックスを選択します) - > jsonファイルを保存します。それは後で。
あなたの好みの環境でホストできるNodeJsサーバを設定する
queue/specs
内の次のエンドポイントを作成する"request_response":
{ "error_state": "request_error_processing", "finished_state": "finished_state", "in_progress_state": "request_in_progress", "start_state": "request_started" }
NodeJsサーバの内部では、firebaseサーバー側のバージョンをインストール
npm install firebase --save
し、我々はステップ3から得たJSONファイルを使用して、サービスアカウントをintialize、それは次のようになりfirebase.initializeApp({serviceAccount: './your_file.json'、databaseURL: 'get_from_firebase_account'});
建築
それはどのように動作するのか全サイクルです。
フロントエンド側では、これらの手順を実行します
- firebase web sdkを使用すると、エンドポイント 'queue / tasks'のfirebaseデータベースに直接リクエストを書き込み、バックエンドに送信しているリクエストをコールできます。
- タスクを挿入した後、バックエンドがリクエストの処理を終了したときに呼び出されるエンドポイント
queue/tasks/{taskKey}
リスナーを登録しています。
バックエンド側では、これらの手順を実行します
- エンドポイント 'キュー/タスク'を無期限にリッスンするサーバーを作成する
- タスクを処理し、応答データを
queue/tasks/response
内に書き戻します。 - タスクを削除する
まず、このヘルパー関数を作成します。これは、コールバックと約束を一緒に処理する方法を提供します
function createPromiseCallback() {
var cb;
var promise = new Promise(function (resolve, reject) {
cb = function (err, data) {
if (err) return reject(err);
return resolve(data);
};
});
cb.promise = promise;
return cb;
}
フロントエンド側では、この機能を使用します
function sendRequest(kind, params, cb) {
cb = cb || createPromiseCallback();
var requestObject = {
kind: kind,
params: params
};
var tasksRef = firebase.database().ref('queue/tasks');
var requestKey = tasksRef.push().key;
var requestRef = tasksRef.child(requestKey);
function requestHandshake(snap) {
if (snap && snap.exists() && (snap.val().response || snap.val()._state === config.firebase.task.finishState || snap.val()._error_details)) {
var snapVal = snap.val();
if (snapVal._error_details) {
cb(snapVal._error_details.error);
} else {
cb(null, snapVal.response);
}
requestRef.off('value', requestHandshake);
}
}
var bulkUpdate = {};
bulkUpdate['queue/tasks/' + requestKey + '/request'] = requestObject;
bulkUpdate['queue/tasks/' + requestKey + '/_state'] = config.firebase.task.startState;
firebase.database().ref().update(bulkUpdate)
.then(function (snap) {
requestRef.on('value', requestHandshake);
}).catch(function (err) {
cb(err);
});
return cb.promise;
}
sendRequest('CreateHouseFacade', {houseName:'Test'})
ようなこの関数を使うことができます。
種類パラメータは、バックエンドに対して、処理要求のためにどのメソッドを呼び出すかを知るためのものです。 Paramsは、追加のパラメータ情報を渡すためのものです。
そして、ここにバックエンドコードがあります
const database = firebase.database();
const queueRef = database.ref('queue');
const queueOptions = {
'specId': 'request_response',
'sanitize': false,
'suppressStack': false,
'numWorkers': 3
};
function removeTask(task) {
var taskRef = queueRef.child(`tasks/${task._id}`);
return taskRef.remove();
}
function processTask(data, progress, resolve, reject) {
try {
requestHandler(data.request).then(response => {
data.response = response || null;
return resolve(data);
}).catch(err => {
return reject(err);
}).then(snap => {
removeTask(data);
});
} catch (err) {
reject(err).then(snap => removeTask(data));
}
}
function requestHandler(request) {
if (!request || !request.kind) throw new Error('Absent Request or Kind');
var deferredResponse = requestHandlerFactory(request.kind, request.params);
return deferredResponse;
}
function requestHandlerFactory(kind, params) {
// It includes mapping all your backend services
switch (kind) {
case 'CreateHouseFacade': return myService(params)
default: throw new Error(`Invalid kind ${kind} was specified`);
}
}
関数myService
は、 CreateHouseFacade
リクエストを達成するビジネスロジックコードが含まれています。