수색…


애플리케이션의 백엔드로 firebase 대기열을 사용하는 방법

Firebase는 백엔드를 서비스로 제공합니다. 애플리케이션 개발자는 백엔드 코드를 가질 수있는 옵션이 없습니다.

이 예제는 firebase queue를 사용하여 firebase 데이터베이스의 맨 위에서 작동하고 프론트 엔드 애플리케이션의 백엔드 역할을하는 백엔드를 만드는 방법을 보여줍니다.

코드를 작성하기 전에 아키텍처가 어떻게 작동하는지 이해할 수 있습니다. 간단히하기 위해 웹 사이트를 프론트 엔드로 사용하고 NodeJs 서버를 백엔드로 사용한다고 가정합니다

선결 요건

  1. Google 계정을 사용하여 firebase 응용 프로그램 만들기

  2. 웹 페이지에 firebase를 추가하십시오. 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 server side version을 npm install firebase --save 하고 npm install firebase --save 하고 3 단계에서 얻은 json 파일을 사용하여 서비스 계정을 초기화합니다.

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

건축물

어떻게 작동하는지 전체주기가 있습니다.

프런트 엔드 측면에서 이러한 단계를 수행 할 것입니다.

  1. firebase web sdk를 사용하면 요청을 엔드 포인트 '대기열 / 작업'의 firebase 데이터베이스에 직접 작성하고 요청을 백엔드로 전송할 수 있습니다.
  2. 태스크를 삽입 한 후, 엔드 포인트 queue/tasks/{taskKey} 에 리스너를 등록합니다.이 태스크는 백엔드가 요청 처리를 완료 할 때 호출되며, 위 태스크에 응답을 작성합니다

백엔드 측에서 이러한 단계를 수행 할 것입니다.

  1. 엔드 포인트 '대기열 / 태스크'를 무한정 수신하는 서버 작성
  2. 작업을 처리하고 queue/tasks/response 내에 응답 데이터를 다시 작성 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