Поиск…


Как использовать очередь firebase в качестве бэкэнд для вашего приложения

Firebase обеспечивает бэкэнд как услугу, так как разработчик приложений не имеет возможности иметь внутренний код.

В этом примере показано, как использовать очередь firebase, создать бэкэнд, который будет работать в верхней части базы данных firebase и служить в качестве бэкэнд для вашего внешнего приложения.

Прежде чем войти в код, вы сможете понять архитектуру, как она будет работать. Для краткости давайте предположим, что мы используем веб-сайт как интерфейс и сервер NodeJs в качестве бэкэнд

Предпосылки

  1. Создайте приложение firebase, используя свою учетную запись google

  2. Добавьте firebase на свою веб-страницу. Использовать bower install firebase --save

  3. Создайте учетную запись службы, используя новую созданную учетную запись firebase (Настройки-> Разрешения -> Учетные записи службы -> CREATE SERVICE ACCOUNT -> (укажите имя и установите флажок «Обрезать новый закрытый ключ») -> сохраните файл json, нам понадобятся это позже.

  4. Настройте сервер NodeJs, который может быть размещен в вашей предпочтительной среде.

  5. Создать следующую конечную точку внутри queue/specs

    "ответ на запрос":

     {
         "error_state": "request_error_processing",
         "finished_state": "finished_state",
         "in_progress_state": "request_in_progress",
         "start_state": "request_started"
     }
    
  6. Внутри сервера NodeJs установите версию серверной версии npm install firebase --save , npm install firebase --save и запустите свою учетную запись службы, используя json-файл, который мы получили с шага 3, он выглядит так:

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

Архитектура

Вот весь цикл, как он работает.

На стороне интерфейса вы сделаете эти шаги

  1. Используя firebase web sdk, вы пишете свои запросы непосредственно в базу данных firebase в очереди / задачах конечной точки, вы можете вызвать этот запрос, который вы отправляете на сервер.
  2. после вставки вашей задачи вы регистрируете слушателя в queue/tasks/{taskKey} конечной точки 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'}) .

Добрый параметр для бэкэнд, чтобы узнать, какой метод вызывать для запроса обработки. Парамс предназначен для передачи дополнительной информации о параметрах.

И вот код бэкэнд

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