programing

Meteor Publish/Subscribe 이해

stoneblock 2023. 3. 10. 21:01

Meteor Publish/Subscribe 이해

간단한 앱이 셋업되어 있습니다.Projects. 제거했습니다.autopublish고객에게 모든 것을 보내지 않도록 패키지를 준비합니다.

 <template name="projectsIndex">    
   {{#each projects}}      
     {{name}}
   {{/each}}
 </template>

autopublish 있으면 됩니다.

if Meteor.isClient
  Template.projectsIndex.projects = Projects.find()

제거한 상태에서 추가로 다음을 수행해야 합니다.

 if Meteor.isServer
   Meteor.publish "projects", ->
     Projects.find()
 if Meteor.isClient
   Meteor.subscribe "projects"
   Template.projectsIndex.projects = Projects.find()

측이라고 것은 요?find()방법은 서버 측에서 게시된 레코드만 검색합니까?만 될 것 이 없었어find() one. one.

수집, 출판물 및 구독은 Meteor의 까다로운 영역이며, 문서에서는 종종 혼란스러운 용어로 인해 증폭되는 빈번한 혼란을 피하기 위해 보다 자세히 논의할 수 있습니다.

다음은 Sacha Greif(Discover Meteor의 공동 저자)가 한 슬라이드로 출판물과 구독에 대해 설명합니다.

서브스크립션

""를해야 하는지 .find()Meteor에서 컬렉션, 출판물 및 구독이 어떻게 작동하는지 이해해야 합니다.

  1. 컬렉션은 MongoDB에서 정의합니다.Meteor는 아직 관련되지 않았다.이러한 컬렉션에는 데이터베이스 레코드(Mongo와 Meteor 모두 "문서"라고도 함)가 포함되어 있지만 "문서"는 데이터베이스 레코드보다 일반적입니다. 예를 들어 업데이트 사양이나 쿼리 선택 도구도 문서입니다. JavaScript 개체는 다음을 포함합니다.field: value쌍 ) 。

  2. 그런 다음 Meteor 서버에서 수집정의합니다.

    MyCollection = new Mongo.Collection('collection-name-in-mongo')
    

    이러한 컬렉션에는 MongoDB 컬렉션의 모든 데이터가 포함되어 있습니다.이러한 컬렉션에는MyCollection.find({...})이 경우 커서(레코드 세트, 레코드를 반복하여 반환하는 방법)가 반환됩니다.

  3. 이 커서는 레코드 세트("레코드 세트"라고 함)를 게시(전송)하는 데 사용됩니다.선택적으로 이러한 레코드의 일부 필드만 게시할 수 있습니다.클라이언트가 서브스크라이브하는 것은 레코드 세트(컬렉션 아님)입니다.퍼블리싱은 새로운 클라이언트가 구독할 때마다 호출되며 반환할 레코드를 관리하기 위한 매개 변수(예: 사용자 ID, 해당 사용자의 문서만 반환)를 사용할 수 있는 퍼블리싱 기능에 의해 수행됩니다.

  4. 클라이언트에는 서버의 레코드 일부를 부분적으로 미러링하는 Minimongo 컬렉션이 있습니다."부분적으로" 필드는 일부만 포함할 수 있으며, "일부 레코드"는 일반적으로 클라이언트에 필요한 레코드만 전송하고 페이지 로드를 고속화하기 위해 필요한 레코드만 전송하며 액세스 권한이 있는 레코드만 전송하려고 하기 때문입니다.

    Minimongo는 기본적으로 순수 JavaScript에서 Mongo를 메모리 내에서 비영구적으로 구현한 것입니다.이 클라이언트는 이 클라이언트가 작업 중인 데이터베이스의 하위 집합만 저장하는 로컬 캐시 역할을 합니다.클라이언트의 쿼리(검색)는 서버와 대화하지 않고 이 캐시에서 직접 처리됩니다.

    이러한 Minimongo 컬렉션은 처음에는 비어 있습니다.에 의해 채워집니다.

    Meteor.subscribe('record-set-name')
    

    서브스크라이브하는 파라미터는 컬렉션명이 아닙니다.이것은 서버가 콜에서 사용한 레코드 세트의 이름입니다.publish ★★★★★★★★★★★★★★.subscribe()콜은 클라이언트를 레코드 세트(서버 컬렉션의 레코드 서브셋(최신 100개의 블로그 투고 등)에 등록합니다.각 레코드에는 필드의 전부 또는 서브셋이 포함되어 있습니다(예: 한정).title ★★★★★★★★★★★★★★★★★」date를 배치할 알 수 있습니까?) Minimongo는 수신 레코드를 어떤 컬렉션에 배치해야 하는지 어떻게 알 수 있습니까?컬렉션의 이름은collection의 ""에서 되는 "added,changed , , , , 입니다.removed콜백 또는 콜백이 없는 경우(대부분의 경우), 서버상의 MongoDB 컬렉션의 이름이 됩니다.

레코드 수정

여기서 Meteor는 매우 편리합니다.클라이언트의 Minimongo 컬렉션에 있는 레코드(문서)를 변경하면 Meteor는 이에 의존하는 모든 템플릿을 즉시 갱신하고 또한 변경 내용을 서버로 되돌립니다.서버는 변경 내용을 MongoDB에 저장하여 서브가 있는 적절한 클라이언트에 보냅니다.그 문서를 포함한 레코드 세트에 스크라이브 됩니다.이것은 대기시간 보상이라고 불리며 운석의 7가지 핵심 원리 중 하나이다.

복수 서브스크립션

수에서 온 이러한 클라이언트 됩니다._id이는 명확하게 설명되지는 않지만 Meteor 문서에 의해 암시됩니다.

레코드 세트를 서브스크라이브 하면, 서버에 레코드를 클라이언트에 송신하도록 지시합니다.를 로컬 레코드는 "Minimongo"와 같은 됩니다.이러한 레코드는collection의 ""에서 되는 "added,changed , , , , 입니다.removedMongo를 까지 수신 입니다.Meteor는 당신이 Mongo를 선언할 때까지 들어오는 특성들을 대기시킬 것이다.일치하는 컬렉션 이름을 가진 클라이언트의 컬렉션입니다.

설명되지 않은 것은 명시적으로 사용하지 않을 때 발생하는 현상입니다.added,changed ★★★★★★★★★★★★★★★★★」removed또는 퍼블리시 핸들러 - 대부분의 경우.이 가장 일반적인 경우 collection 인수는 순서 1에서 서버에 선언한 MongoDB 컬렉션 이름에서 가져온 것입니다.그러나 이것은 다른 이름으로 다른 게시물과 구독을 가질 수 있으며 모든 레코드는 클라이언트의 동일한 컬렉션에 포함된다는 것을 의미합니다.Meteor는 최상위 필드 수준까지 문서 간에 집합 결합을 수행하므로 구독이 중복될 수 있습니다. 즉, 클라이언트 작업 및 클라이언트에 서로 다른 최상위 필드를 제공하는 기능을 게시하면 컬렉션에 포함된 문서는 두 필드 집합의 결합이 됩니다.

예: 클라이언트의 동일한 컬렉션을 채우는 여러 서브스크립션

BlogPosts 컬렉션이 있습니다.서버와 클라이언트 양쪽에서 같은 방법으로 선언합니다.다만, 다음과 같은 조작은 다릅니다.

BlogPosts = new Mongo.Collection('posts');

에서는, 「 「」BlogPosts 수 .

  1. 최신 10개의 블로그 투고 구독

    // server
    Meteor.publish('posts-recent', function publishFunction() {
      return BlogPosts.find({}, {sort: {date: -1}, limit: 10});
    }
    // client
    Meteor.subscribe('posts-recent');
    
  2. 현재 사용자의 게시물에 대한 구독

    // server
    Meteor.publish('posts-current-user', function publishFunction() {
      return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
      // this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId
    }
    Meteor.publish('posts-by-user', function publishFunction(who) {
      return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
    }
    
    // client
    Meteor.subscribe('posts-current-user');
    Meteor.subscribe('posts-by-user', someUser);
    
  3. 가장 인기 있는 직책의 기부.

  4. 기타.

은 모두 『 』에서 나온 입니다.posts MongoDB를 수집,BlogPosts 「」로 .BlogPosts클라클

왜 전화해야 요.find()두 번 이상 - 모든 헤드라인 등록의 문서가 동일한 모음에 포함되고 관심 있는 문서만 가져와야 하므로 클라이언트에 두 번째로 있습니다.예를 들어, 클라이언트의 최신 투고를 취득하려면 서버로부터의 쿼리를 미러링하기만 하면 됩니다.

var recentPosts = BlogPosts.find({}, {sort: {date: -1}, limit: 10});

이렇게 하면 클라이언트가 지금까지 받은 모든 문서/레코드(최상위 게시물 및 사용자의 게시물)에 커서가 반환됩니다.(고마워요 제프리).

네, 클라이언트 측 find()는 Minimongo 클라이언트에 있는 문서만 반환합니다.문서로부터:

클라이언트에서는 Minimongo 인스턴스가 생성됩니다.Minimongo는 기본적으로 순수 JavaScript에서 Mongo를 메모리 내에서 비영구적으로 구현한 것입니다.이 클라이언트는 이 클라이언트가 작업 중인 데이터베이스의 하위 집합만 저장하는 로컬 캐시 역할을 합니다.클라이언트의 쿼리(검색)는 서버와 대화하지 않고 이 캐시에서 직접 처리됩니다.

말씀하신 대로 publish()는 클라이언트가 보유할 문서를 지정합니다.

여기서 기본적인 엄지손가락 규칙은publish ★★★★★★★★★★★★★★★★★」subscribed변수 이름은 클라이언트와 서버 측에서 같아야 합니다.

Mongo DB와 클라이언트 측의 컬렉션 이름은 같아야 합니다.

가 ' 및 을 하고 있다고 가정해 보겠습니다.employees 되면 는 '비슷하다'처럼 거예요.


서버측

에서는 「」의 .var키워드는 옵션입니다(이 파일의 컬렉션을 로컬로 만들려면 이 키워드를 사용합니다).

CollectionNameOnServerSide = new Mongo.Collection('employees');   

Meteor.publish('employeesPubSub', function() { 
    return CollectionNameOnServerSide.find({});     
});

클라이언트측 .disc 파일

CollectionNameOnClientSide = new Mongo.Collection('employees');
var employeesData = Meteor.subscribe('employeesPubSub');

Template.templateName.helpers({
  'subcribedDataNotAvailable' : function(){
        return !employeesData.ready();
    },
   'employeeNumbers' : () =>{
       CollectionNameOnClientSide.find({'empId':1});
  }
});

클라이언트측 .disc 파일

쓸 수 요.subcribedDataNotAvailable는 다음과 같습니다.employeeNumbers도우미 방식

<TEMPLATE name="templateName">
{{#if subcribedDataNotAvailable}}
   <h1> data loading ... </h1>
 {{else}}
  {{#each employeeNumbers }}
     {{this}}
  {{/each}}
 {{/if}}
<TEMPLATE>
// on the server
Meteor.publish('posts', function() {

    return Posts.find();

});

// on the client
Meteor.subscribe('posts');

언급URL : https://stackoverflow.com/questions/19826804/understanding-meteor-publish-subscribe