Node.js logo
Swagger Logo

다음을 사용하여 애플리케이션을 빌드할 때 카우치베이스 모바일 서버 측 통합에는 흥미로운 가능성이 많이 있습니다.
동기화 충돌을 해결하기 위한 비즈니스 로직을 만드는 것이 일반적인 용도 중 하나입니다. 동기화 충돌을 해결하기 위해 동기화 게이트웨이 문서 '변경사항' 피드를 사용하면 모든 종류의 이벤트 중심 작업도 쉽게 구현할 수 있습니다. 다음 글에서 이에 대해 살펴보겠습니다.

앱은 두 가지를 모두 사용할 수 있습니다. 동기화 게이트웨이 그리고 카우치베이스 라이트 각각에 대해 ReST API를 직접 호출하여 사용할 수 있습니다. 하지만 그렇게 하려면 많은 상용구 코드를 작성해야 하는데, 그다지 재미있지는 않습니다. PouchDB는 호환 가능한 JavaScript 옵션을 제공하지만, 이제 더 가벼운 대안이 있습니다.

얼마 전 Couchbase는 Swagger를 사용하여 문서화하는 방식으로 전환했습니다. 카우치베이스 모바일 API. Swagger는 생성하는 것 이상의 기능을 제공합니다.
문서가 필요하지 않습니다. 단일 Swagger 사양으로 문서, 서버 스텁 코드, 테스트 케이스, 샌드박스 사이트 등을 생성할 수 있습니다. 무엇보다도 Swagger는 40개 언어로 클라이언트 SDK를 생성할 수 있다는 점이 가장 마음에 들었습니다!

이 글에서는 Swagger Node.js 클라이언트를 사용하는 방법을 보여드리겠습니다. Couchbase에서 문서의 변경 사항을 모니터링하는 매우 간단한 앱을 만들어 보겠습니다. 이것은 앞으로 다른 멋진 것들을 구축하기 위한 기초가 될 것입니다. 시작해 보겠습니다.

필요한 것

따라 하려면 다음이 필요합니다.

  • Node.js(Mac에서 v6.9.1 사용 중)
  • Swagger JS(Swagger Node.js 클라이언트)
  • 카우치베이스 동기화 게이트웨이
  • 동기화 게이트웨이 스웨거 사양

이미 Node.js가 설치되어 있다고 가정합니다.

Swagger JS 라이브러리 설치

명령줄 셸에서 프로젝트를 보관할 디렉터리로 변경합니다.

Swagger 클라이언트 및 종속성을 가져오려면 다음을 실행합니다.

(몇 가지 경고가 표시되지만 무시해도 됩니다.)

동기화 게이트웨이 설치

플랫폼에 맞는 동기화 게이트웨이 패키지 다운로드 여기. (Linux를 실행 중인데 배포용 패키지가 보이지 않는 경우, 다음의 지침을 참조하세요.
이 블로그 게시물 를 클릭해 도움을 요청하세요.)

동기화 게이트웨이를 실행하려면 구성 파일을 만들어야 합니다. 다음은 우리가 사용할 수 있는 간단한 설정입니다. 여기에 있는 텍스트를 복사하여 "sync-gateway-config.json" 또는 이와 유사한 이름의 파일에 붙여넣습니다.

이 구성은 동기화 게이트웨이 테스트를 위해 만들어진 기본 제공 데이터베이스를 사용합니다. 서버는 로컬 호스트의 연결에만 응답합니다. 이 글의 끝 부분에서 동기화 게이트웨이 구성에 대해 자세히 알아볼 수 있는 리소스를 찾을 수 있습니다.

동기화 게이트웨이를 실행하여 시작

몇 가지 로깅 출력을 볼 수 있습니다. 나중에 앱을 실행할 때 로그를 보면 흥미로울 수 있습니다.

동기화 게이트웨이 스웨거 사양 사본 만들기

공용 동기화 게이트웨이 ReST API(관리자 API와 비교)에 대한 Swagger 사양은 다음에서 확인할 수 있습니다. https://docs.couchbase.com/sync-gateway/current/_attachments/sync-gateway-admin.yaml.

Swagger 사양은 JSON으로 저장됩니다. Swagger에서 직접 텍스트를 다운로드할 수 있지만 복사본을 만드는 것이 가장 좋습니다. 이렇게 하면 사양이 변경되더라도 앱이 손상되지 않습니다.

정보를 프로젝트 디렉토리에 있는 sync-gateway-spec.json 또는 이와 유사한 이름의 파일에 복사합니다. 이 파일은 Node가 처리할 수 있도록 확장자가 .json이어야 합니다.

Node.js 앱 만들기

앱을 조합해 보겠습니다. 프로젝트 디렉터리에서 확장자가 .js로 끝나는 새 파일을 엽니다. 저는 app.js라는 파일을 사용했습니다.

첫 번째 줄은 Swagger 클라이언트를 가져와서 사용할 수 있도록 합니다. 두 번째 줄은 조금 더 특이합니다. 이 줄은 사양 객체를 파일에서 가져올 수 있습니다. 이것이 바로 .json 확장자가 중요한 이유입니다. Node가 이를 통해 우리가 하나의
일반 패키지가 아닌 JSON을 가져옵니다.

사양 파일에는 호스트가 하드 와이어되어 있지만 직접 설정해 보겠습니다.

다음으로, 호출을 위한 매개 변수를 준비하겠습니다. _changes 엔드포인트.

여기에는 엔드포인트 URL의 일부가 되는 데이터베이스 이름(test)과 설정하려는 몇 가지 옵션이 혼합되어 있습니다.

이제 필요한 것을 초기화했으니 Swagger 클라이언트 인스턴스를 만들 수 있습니다.

여기서 주의해야 할 몇 가지 중요한 사항이 있습니다.

클라이언트를 동기식으로 사용하고 있습니다. 원하는 경우, 자바스크립트 프로미스를 다음과 같이 지정하여 사용할 수 있습니다. 사용 약속: true. 실제 처리를 하지 않고 코드가 약간 복잡해지기 때문에 그렇게 하고 싶지 않았습니다.

대신 사양: 사양를 사용하여 Swagger 사양에 대한 URL을 나열할 수 있습니다. URL:. 다시 말하지만, 사양이 원격으로 변경되어 코드가 손상될 수 있으므로 적어도 프로덕션 환경에서는 이를 피해야 합니다.

그리고 성공: 항목은 두 개의 함수를 지정합니다. 둘 다 콜백입니다. 첫 번째는 구성이 성공하면 호출되고 두 번째는 실패하면 호출됩니다. 이 함수는 어떤 의미에서 "전역"입니다. 이 함수는 다른 함수를 지정하지 않으면 기본값으로 작동합니다.
개별 통화. 오류 발생 시 매우 유용합니다.

인스턴스를 변수에 할당합니다. 클라이언트. 클라이언트 인스턴스는 비동기적으로 채워집니다. 성공 콜백이 발생할 때까지는 사용할 준비가 되지 않습니다. 따라서 다음과 같은 흥미로운 구조가 있습니다. 클라이언트 는 내부적으로
콜백. Promises 버전에서는 클라이언트가 함수 호출의 .then 절을 사용합니다.

코드의 다음 부분에서는 클라이언트를 사용해 _changes 엔드포인트.

호출하려는 함수의 이름을 어떻게 찾을 수 있을까요? 엔드포인트와 함수 이름 사이에는 고정된 매핑이 없습니다. 이것은 Swagger의 또 다른 편리한 기능입니다. 클라이언트 클래스는 자체 문서화되어 있습니다. 여러분은 help() 를 원하는 수준에서 사용할 수 있습니다. 예를 들어 데이터베이스 아래의 엔드포인트를 찾으려면 코드에 이를 추가하세요:

도움말 출력은 명령줄 출력(또는 IDE의 콘솔)에 표시됩니다. 여기에는 엔드포인트와 가능한 모든 매개변수가 설명되어 있습니다.

클라이언트 호출로 돌아가서, 데이터베이스 이름(필수)과 여러 매개 변수를 함께 묶어서 쿼리 객체입니다. 약간 혼란스러웠습니다. 이러한 객체가 분리되어 있을 것으로 예상할 수 있지만 그렇지 않습니다.
작동합니다. 제가 찾은 어떤 예시도 이에 대해 설명하지 못했습니다.

콜백 함수를 제공했습니다. 메시지. (ReST 호출이 성공할 때 사용됩니다. 실패를 처리하는 데는 기본값을 사용합니다.)

콜백은 응답의 모든 세부 정보가 포함된 객체를 수신합니다. 동기화 게이트웨이 변경 피드를 수신하는 데 필요한 루프 구조를 보여주기 위해 이 앱을 작성했습니다. 따라서 메시지 함수는 별다른 역할을 하지 않습니다. 호출을 작성합니다.
응답을 디버깅 목적으로 보냅니다. 그런 다음 돌아가서 다음 업데이트를 기다리려고 합니다. 동기화 게이트웨이는 시퀀스 ID를 기반으로 무엇을 푸시할지 알고 있습니다. 이를 제어하기 위해 last_seq 지난 응답의 정보입니다.

여기까지입니다. 다음은 앱의 전체 코드입니다.

최종 참고 사항

앱을 실행하여 사용해 볼 수 있습니다. 동기화 게이트웨이가 실행 중인지 확인합니다. 그런 다음

동기화 게이트웨이 로그에 앱 자체에서 다음과 같은 응답이 표시되어야 합니다:

이제 새 문서를 추가합니다. 명령줄에서 cURL을 사용하여 이 작업을 수행할 수 있습니다. 다음은 예제입니다.

노드 앱은 다음과 같은 내용을 출력해야 합니다:

기타 리소스

자세히 알아보기 카우치베이스 모바일.

자세히 알아보기 동기화 게이트웨이 ReST API.

그리고 Swagger JS 클라이언트 GitHub 리포지토리 에는 몇 가지 유용한 문서가 포함되어 있습니다.

스웨거에 대한 자세한 내용은 다음에서 확인하세요. http://swagger.io.

온라인 Swagger 에디터는 정말 유용합니다. 여기에서 클라이언트 SDK를 생성하거나 API를 직접 사용해 볼 수도 있습니다. Swagger 사양을 에디터에 붙여넣기만 하면 됩니다. http://editor.swagger.io/

자바스크립트 클라이언트를 사용하는 리액트 네이티브 카우치베이스 커뮤니티 프로젝트가 있습니다. 흥미로운 예제는 다음 링크에서 확인할 수 있습니다. https://github.com/couchbaselabs/react-native-couchbase-lite

포스트 스크립트

더 많은 리소스를 확인하세요. 개발자 포털 트위터에서 팔로우하세요 카우치베이스 개발.

질문에 대한 답변을 게시할 수 있습니다. 포럼. 그리고 다음에도 적극적으로 참여합니다. 스택 오버플로.

다음 주소에서 저를 개인적으로 팔로우할 수 있습니다. 호드그릴리

작성자

게시자 호드 그릴리, 개발자 옹호자, 카우치베이스

호드 그레이리는 실리콘밸리에 거주하는 카우치베이스의 개발자 옹호자입니다. 그는 소프트웨어 엔지니어 및 엔지니어링 관리자로서 20년 이상의 경력을 보유하고 있습니다. 그는 전산 물리학 및 화학, 컴퓨터 및 네트워크 보안, 금융, 모바일 등 다양한 소프트웨어 분야에서 일해 왔습니다. 2016년 카우치베이스에 합류하기 전에는 삼성에서 모바일 개발자 관계를 이끌었습니다. 컬럼비아 대학교에서 화학 물리학 박사 학위를 받았습니다.

댓글 하나

  1. 다소 아이러니하게도 현재 Swagger 동기화 게이트웨이 spec.json에 대한 링크가 유효하지 않습니다. 여기 코드는 매우 유용하고 흥미롭습니다. 해당 사양 파일에 대한 업데이트된 링크가 있나요?

    1. 세르게이 아브제예프, SDK 엔지니어, 카우치베이스 3월 17, 2017에서 6:16 오전

      다음에서 액세스할 수 있습니다. http://docs.couchbasemobile.com/sync-gateway-public/spec.json

      또한 문서에서 테스트 도구를 올바르게 렌더링하고 있습니다.
      https://developer.couchbase.com/documentation/mobile/current/references/couchbase-lite/rest-api/index.html

      일시적인 문제일 수 있습니다.

      1. 조명탄을 충분히 쏴서 누군가 저를 구해준 것 같아요 :P 고마워요!

  2. 또 다른 질문, 이번에는 사용약속 옵션을 사용하세요. 약속을 사용하지 않는 예제에서와 마찬가지로 약속을 사용하는 동안 모니터링을 계속 진행하려면 어떻게 해야 하나요?

    약속을 사용하도록 메서드를 다시 작성했지만 변경 순서가 포함 된 로그 출력에 한 번의 패스가 발생하고 소프트웨어가 계속 살아 있지 않고 종료됩니다. 구성하는 방법에 대한 아이디어가 있나요?


    client = 새 Swagger({옵션})
    .then(모니터)
    .then(메시지)
    .catch(error)

    1. 작은 메아리 방에서 연습한 거 용서해줘요 :-P

      약속을 사용하려면 메시지가 기록될 때마다 새로운 Swagger 클라이언트를 반환하는 패턴을 사용해야 합니다. 초기 클라이언트의 약속이 이행됩니다. 새 클라이언트를 만들어야 하며, 이 클라이언트는 보류가 완료된 후 모니터링할 것입니다. 여기에 코드를 게시할 수는 없지만 매력적으로 작동합니다.

  3. 기본적으로 약속 해결이 다음 단계로 넘어가는 루프를 만들어야 합니다. 전체 예제를 작성할 예정이지만 여기에서는 아이디어를 얻을 수 있는 스니펫을 소개합니다.


    새로운 스웨거({
    사양: 사양,
    사용 약속: true
    })
    .catch(error => die('클라이언트 인스턴스를 생성할 수 없습니다:', error))
    .then(결과 => main(결과))
    .catch(error => die('Failure in main:', error));

    함수 main(client) {
    // 일부 초기화 코드
    변경사항.모니터(클라이언트);
    }

    클래스 변경 {
    static init(client) {
    변경사항.쿼리 = {
    db: db.db,
    active_only: false,
    include_docs: true,
    피드: 'longpoll',
    시간 초과: 0
    };
    }

    static monitor(client) {
    client.database.get_db_changes(Changes.query)
    .then(response => Changes.parse(client, response))
    .catch(error => warn("변경 사항 수신 오류:", error));
    }

    static parse(client, response) {
    for (const response.obj.results의 레코드) {
    // 앱 로직
    변경사항.쿼리.이후 = record.seq;
    }

    변경사항.모니터(클라이언트);
    }
    }

    1. 이메일을 통해 노트를 비교해 볼 의향이 있습니다, Hod. 법적인 이유로 여기에 코드를 게시 할 수는 없지만 업무용 이메일을 통해서는 가능합니다 (파일에 CB가 포함 된 NDA가 있기 때문에). ES6의 30줄에서 작동하도록 만들었습니다.

      1. 좋아요, 네, 어떻게 접근하는지 보고 싶네요. 제 이메일을 가지고 계신 것 같은데, 그냥 에서

  4. [...] 엔드포인트에 대한 API 사양이 정의되면 몇 가지 유용한 기능을 사용할 수 있습니다. 제가 가장 좋아하는 두 가지 기능은 임베드 가능한 "라이브" 문서와 클라이언트 라이브러리입니다. 이 짧은 동영상에서 Swagger의 몇 가지 기능에 대한 데모를 살펴보세요. Swagger JavaScript 클라이언트 사용 예시는 이 블로그 게시물을 참조하세요: https://www.couchbase.com/node-js-swagger-monitor-document-changes-couchbase-mobile/ […]

  5. 꽤 깔끔한 기사였지만 솔직히 약간 혼란스럽습니다. "PouchDB는 호환 가능한 JavaScript 옵션을 제공하지만 이제 더 가벼운 대안이 있습니다"라는 문장이 제 혼란의 원인인 것 같습니다. 이것은 couchbase와 동기화되는 PouchDB와 같은 오프라인 데이터베이스를 사용하는 것에 대한 대안처럼 보이지 않습니다.

  6. 동기화 게이트웨이 ReST API의 상위 레벨 클라이언트 역할을 한다는 의미에서 호환성을 의미했습니다. "PouchDB와 Swagger + 적절한 사양을 모두 갖추면 동기화 게이트웨이와 호환되는 ReST 클라이언트를 사용할 수 있습니다."라고 읽으면 됩니다.

    여기서는 서버 측 노드에 대해 이야기하고 있으므로 문제가 심각할 때만 네트워크에서 벗어난다고 암묵적으로 가정합니다. 따라서 로컬 스토리지는 필요하지 않습니다. 흥미로운 오프라인 시나리오를 무시하려는 것이 아니라 여기서 다루고 있는 것은 그런 시나리오가 아니라는 점을 말씀드리는 것입니다.

댓글 남기기