firebase
파이어베이스 큐
수색…
애플리케이션의 백엔드로 firebase 대기열을 사용하는 방법
Firebase는 백엔드를 서비스로 제공합니다. 애플리케이션 개발자는 백엔드 코드를 가질 수있는 옵션이 없습니다.
이 예제는 firebase queue를 사용하여 firebase 데이터베이스의 맨 위에서 작동하고 프론트 엔드 애플리케이션의 백엔드 역할을하는 백엔드를 만드는 방법을 보여줍니다.
코드를 작성하기 전에 아키텍처가 어떻게 작동하는지 이해할 수 있습니다. 간단히하기 위해 웹 사이트를 프론트 엔드로 사용하고 NodeJs 서버를 백엔드로 사용한다고 가정합니다
선결 요건
Google 계정을 사용하여 firebase 응용 프로그램 만들기
웹 페이지에 firebase를 추가하십시오.
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 server side version을
npm install firebase --save
하고npm install firebase --save
하고 3 단계에서 얻은 json 파일을 사용하여 서비스 계정을 초기화합니다.firebase.initializeApp ({serviceAccount : './your_file.json', databaseURL : 'get_from_firebase_account'});
건축물
어떻게 작동하는지 전체주기가 있습니다.
프런트 엔드 측면에서 이러한 단계를 수행 할 것입니다.
- firebase web sdk를 사용하면 요청을 엔드 포인트 '대기열 / 작업'의 firebase 데이터베이스에 직접 작성하고 요청을 백엔드로 전송할 수 있습니다.
- 태스크를 삽입 한 후, 엔드 포인트
queue/tasks/{taskKey}
에 리스너를 등록합니다.이 태스크는 백엔드가 요청 처리를 완료 할 때 호출되며, 위 태스크에 응답을 작성합니다
백엔드 측에서 이러한 단계를 수행 할 것입니다.
- 엔드 포인트 '대기열 / 태스크'를 무한정 수신하는 서버 작성
- 작업을 처리하고
queue/tasks/response
내에 응답 데이터를 다시 작성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
요청을 수행 할 비즈니스 로직 코드를 포함합니다.