firebase
Eldkö
Sök…
Så här använder du eldbaskön som backend för din applikation
Firebase tillhandahåller backend som en tjänst, som applikationsutvecklare har du inget alternativ att ha backendkod.
Det här exemplet visar hur du använder firebas-kön, skapar backend som fungerar längst upp i databasen och fungerar som en backend för din frontend-applikation.
Innan du går in i koden låter oss förstå arkitekturen, hur den kommer att fungera. För korthet kan vi anta att vi använder webbplatsen som en frontend och NodeJs server som en backend
förutsättningar
Skapa brandbasapplikation med ditt Google-konto
Lägg till eldfas till din webbsida. Använd
bower install firebase --save
Skapa servicekonto med ditt nya skapade brandkonto (Inställningar-> Behörigheter -> Servicekonton -> SKAPA TJÄNSTKONTO -> (ange namn och markera kryssrutan "Möbler en ny privat nyckel") -> spara json-filen, vi behöver det senare.
Konfigurera NodeJs-server som kan vara värd i din önskade miljö
Skapa följande slutpunkt i
queue/specs
"Request_response"
{ "error_state": "request_error_processing", "finished_state": "finished_state", "in_progress_state": "request_in_progress", "start_state": "request_started" }
Inuti NodeJs-servern installerar firebas-servernsideversion,
npm install firebase --save
, och intialiserar ditt servicekonto med json-filen som vi fick från steg 3, det ser ut så härfirebase.initializeApp ({serviceAccount: './your_file.json', databasURL: 'get_from_firebase_account'});
Arkitektur
Här är hela cykeln hur det fungerar.
På framsidan kommer du att göra dessa steg
- Med hjälp av firebase web sdk skriver du dina förfrågningar direkt till brandbasdatabasen i slutpunkten "kö / uppgifter", låter ringa din begäran som du skickar till backend.
- efter att du har lagt in din uppgift registrerar du lyssnaren i slutpunktskön
queue/tasks/{taskKey}
som skulle kallas när backend är klar med att behandla din begäran, skriva svar inuti ovanstående uppgift
På baksidan kommer du att göra dessa steg
- Skapa server som oändligt lyssnar slutpunkten "kö / uppgifter"
- Behandlar dina uppgifter och skriver tillbaka svarsdata inuti
queue/tasks/response
- Ta bort uppgiften
Skapa först denna hjälpfunktion, som ger ett sätt att hantera återuppringningar och löften tillsammans
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;
}
På framsidan kommer du att ha den här funktionen
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;
}
Du kan använda den här funktionen som sendRequest('CreateHouseFacade', {houseName:'Test'})
.
Vänlig parameter är för backend, för att veta vilken metod som ska anropas för behandlingsbegäran. Params är för att skicka ytterligare parameterinformation.
Och här är backendkoden
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`);
}
}
Funktionen myService
innehåller din affärslogikkod som kommer att utföra CreateHouseFacade
begäran.