firebase
Очередь Firebase
Поиск…
Как использовать очередь firebase в качестве бэкэнд для вашего приложения
Firebase обеспечивает бэкэнд как услугу, так как разработчик приложений не имеет возможности иметь внутренний код.
В этом примере показано, как использовать очередь firebase, создать бэкэнд, который будет работать в верхней части базы данных firebase и служить в качестве бэкэнд для вашего внешнего приложения.
Прежде чем войти в код, вы сможете понять архитектуру, как она будет работать. Для краткости давайте предположим, что мы используем веб-сайт как интерфейс и сервер NodeJs в качестве бэкэнд
Предпосылки
Создайте приложение firebase, используя свою учетную запись google
Добавьте firebase на свою веб-страницу. Использовать
bower install firebase --save
Создайте учетную запись службы, используя новую созданную учетную запись firebase (Настройки-> Разрешения -> Учетные записи службы -> CREATE SERVICE ACCOUNT -> (укажите имя и установите флажок «Обрезать новый закрытый ключ») -> сохраните файл json, нам понадобятся это позже.
Настройте сервер NodeJs, который может быть размещен в вашей предпочтительной среде.
Создать следующую конечную точку внутри
queue/specs
"ответ на запрос":
{ "error_state": "request_error_processing", "finished_state": "finished_state", "in_progress_state": "request_in_progress", "start_state": "request_started" }
Внутри сервера NodeJs установите версию серверной версии
npm install firebase --save
,npm install firebase --save
и запустите свою учетную запись службы, используя json-файл, который мы получили с шага 3, он выглядит так:firebase.initializeApp ({serviceAccount: './your_file.json', databaseURL: 'get_from_firebase_account'});
Архитектура
Вот весь цикл, как он работает.
На стороне интерфейса вы сделаете эти шаги
- Используя firebase web sdk, вы пишете свои запросы непосредственно в базу данных firebase в очереди / задачах конечной точки, вы можете вызвать этот запрос, который вы отправляете на сервер.
- после вставки вашей задачи вы регистрируете слушателя в
queue/tasks/{taskKey}
конечной точки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'})
.
Добрый параметр для бэкэнд, чтобы узнать, какой метод вызывать для запроса обработки. Парамс предназначен для передачи дополнительной информации о параметрах.
И вот код бэкэнд
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
.