サーチ…


アプリケーションのバックエンドとしてfirebase queueを使用する方法

Firebaseはバックエンドをサービスとして提供しますが、アプリケーション開発者はバックエンドコードを持つオプションがありません。

この例では、firebaseキューを使用してfirebaseデータベースの一番上で動作し、フロントエンドアプリケーションのバックエンドとして機能するバックエンドを作成する方法を示します。

コードに入る前に、アーキテクチャがどのように機能するのか理解できます。簡潔にするために、Webサイトをフロントエンドとして、NodeJsサーバーをバックエンドとして使用しているとします

前提条件

  1. あなたのGoogleアカウントを使ってfirebaseアプリケーションを作成する

  2. あなたのウェブページにfirebaseを追加してください。 bower install firebase --save使用bower install firebase --save

  3. 新しい作成されたfirebaseアカウントを使用してサービスアカウントを作成します(設定 - >権限 - >サービスアカウント - >サービスアカウントの作成 - >名前を指定して「新しい秘密鍵を提供する」チェックボックスを選択します) - > jsonファイルを保存します。それは後で。

  4. あなたの好みの環境でホストできるNodeJsサーバを設定する

  5. queue/specs内の次のエンドポイントを作成する

    "request_response":

     {
         "error_state": "request_error_processing",
         "finished_state": "finished_state",
         "in_progress_state": "request_in_progress",
         "start_state": "request_started"
     }
    
  6. NodeJsサーバの内部では、firebaseサーバー側のバージョンをインストールnpm install firebase --saveし、我々はステップ3から得たJSONファイルを使用して、サービスアカウントをintialize、それは次のようになり

    firebase.initializeApp({serviceAccount: './your_file.json'、databaseURL: 'get_from_firebase_account'});

建築

それはどのように動作するのか全サイクルです。

フロントエンド側では、これらの手順を実行します

  1. firebase web sdkを使用すると、エンドポイント 'queue / tasks'のfirebaseデータベースに直接リクエストを書き込み、バックエンドに送信しているリクエストをコールできます。
  2. タスクを挿入した後、バックエンドがリクエストの処理を終了したときに呼び出されるエンドポイントqueue/tasks/{taskKey}リスナーを登録しています。

バックエンド側では、これらの手順を実行します

  1. エンドポイント 'キュー/タスク'を無期限にリッスンするサーバーを作成する
  2. タスクを処理し、応答データをqueue/tasks/response内に書き戻します。
  3. タスクを削除する

まず、このヘルパー関数を作成します。これは、コールバックと約束を一緒に処理する方法を提供します

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リクエストを達成するビジネスロジックコードが含まれています。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow