수색…


비고

Meteor의 데이터 서브 시스템 내에서 서버 게시 및 해당 클라이언트 구독은 서버와 클라이언트간에 기본 데이터가 지속적으로 동기화되는 반응 형 실시간 데이터 전송의 주요 메커니즘입니다.

기본 구독 및 출판

먼저 autopublish 제거 autopublish . autopublish 자동으로 클라이언트 측에 전체 데이터베이스를 게시 등 게시 및 구독의 효과는 볼 수 없습니다.

autopublish 를 제거하려면 다음 단계를 따르 autopublish .

$ meteor remove autopublish

그런 다음 게시판을 만들 수 있습니다. 아래는 완전한 예입니다.

import { Mongo } from 'meteor/mongo';
import { Meteor } from 'meteor/meteor';

const Todos = new Mongo.Collection('todos');

const TODOS = [
  { title: 'Create documentation' },
  { title: 'Submit to Stack Overflow' }
];

if (Meteor.isServer) {
  Meteor.startup(function () {
    TODOS.forEach(todo => {
      Todos.upsert(
        { title: todo.title },
        { $setOnInsert: todo }
      );
    });
  });

  // first parameter is a name.
  Meteor.publish('todos', function () {
    return Todos.find();
  });
}

if (Meteor.isClient) {
  // subscribe by name to the publication.
  Meteor.startup(function () {
    Meteor.subscribe('todos');
  })
}

전세계 간행물

전역 게시에는 이름이 없으므로 연결된 클라이언트의 구독이 필요하지 않으므로 클라이언트가 서버에 연결하자마자 연결된 클라이언트가 사용할 수 있습니다.

이를 달성하기 위해 출판물의 이름을 단순히 null 로 지정합니다.

Meteor.publish(null, function() {
  return SomeCollection.find();
})

지명 된 출판물

명명 된 출판물은 이름을 가지고 있으며 클라이언트에서 명시 적으로 구독해야합니다.

다음과 같은 서버 측 코드를 고려하십시오.

Meteor.publish('somePublication', function() {
  return SomeCollection.find()
})

고객은 다음을 통해 요청해야합니다.

Meteor.subscribe('somePublication')

템플릿 범위가 지정된 구독

Meteor의 기본 템플릿 시스템 Spacebars 및 기본 렌더링 서브 시스템 Blaze는 단순한 템플릿 코드 조각이 자체 데이터에 가입하고 템플릿 조각 해지 중에 자체 추적을 중단하고 정리할 수 있도록 게시 라이프 사이클 메소드와는 아무런 관련이 없습니다.

이것을 활용하려면 다음과 같이 Meteor 기호가 아닌 템플릿 인스턴스를 구독해야합니다.

먼저 템플릿을 설정하십시오.

<template name="myTemplate">
  We will use some data from a publication here
</template>

그런 다음 해당 라이프 사이클 콜백을 누릅니다.

Template.myTemplate.onCreated(function() {
  const templateInstance = this;
  templateInstance.subscribe('somePublication')
})

이제이 템플릿이 파괴되면 발행물도 자동으로 중지됩니다.

참고 : 가입 된 데이터는 모든 템플릿에서 사용할 수 있습니다.

일시적인 클라이언트 측 컬렉션으로 게시합니다.

게시 된 것을 미세 조정해야하는 경우.

import { Mongo } from 'meteor/mongo';
import { Meteor } from 'meteor/meteor';
import { Random } from 'meteor/random';

if (Meteor.isClient) {
  // established this collection on the client only.
  // a name is required (first parameter) and this is not persisted on the server.
  const Messages = new Mongo.Collection('messages');
  Meteor.startup(function () {
    Meteor.subscribe('messages');
    Messages.find().observe({
      added: function (message) {
        console.log('Received a new message at ' + message.timestamp);
      }
    });
  })
}

if (Meteor.isServer) {
  // this will add a new message every 5 seconds.
  Meteor.publish('messages', function () {
    const interval = Meteor.setInterval(() => {
      this.added('messages', Random.id(), {
        message: '5 seconds have passed',
        timestamp: new Date()
      })
    }, 5000);
    this.added('messages', Random.id(), {
      message: 'First message',
      timestamp: new Date()
    });
    this.onStop(() => Meteor.clearInterval(interval));
  });
}

발행물의 오류 생성 및 응답.

서버에서 이와 같은 발행물을 작성할 수 있습니다. this.userId 는 현재 로그인 한 사용자의 ID입니다. 로그인 한 사용자가없는 경우 오류를 던져 응답 할 수 있습니다.

import Secrets from '/imports/collections/Secrets';

Meteor.publish('protected_data', function () {
  if (!this.userId) {
    this.error(new Meteor.Error(403, "Not Logged In."));
    this.ready();
  } else {
    return Secrets.find();
  }
});

클라이언트에서 다음과 같이 응답 할 수 있습니다.

Meteor.subscribe('protected_data', {
  onError(err) {
    if (err.error === 403) {
      alert("Looks like you're not logged in");
    }
  },
});

File / imports / collections / Secrets는 다음과 같이 비밀 컬렉션에 대한 참조를 만듭니다.

const Secrets = new Mongo.Collection('secrets');

게시판에 적극적으로 다시 등록

템플릿 자동 실행을 사용하여 게시에 다시 가입 할 수 있습니다. 그것은 변화에 의존 하는 반응 데이터가 있을 때마다 다시 실행되는 반응 적 상황을 설정합니다. 또한 자동 실행은 항상 한 번 실행됩니다 (처음 실행될 때).

템플릿 자동 실행은 일반적으로 onCreated 메소드에 저장됩니다.

Template.myTemplate.onCreated(function() {
  this.parameter = new ReactiveVar();
  this.autorun(() => {
    this.subscribe('myPublication', this.parameter.get());
  });
});

이것은 한 번 (처음) 실행되고 구독을 설정합니다. parameter 반응 변수가 변경 될 때마다 다시 실행됩니다.

게시 된 데이터를 가져 오는 동안 블레이즈보기를 기다립니다.

템플릿 JS 코드

Template.templateName.onCreated(function(){
    this.subscribe('subsription1');
    this.subscribe('subscription2');
});

템플릿 HTML 코드

<template name="templateName">
    {{#if Template.subscriptionsReady }}
        //your actual view with data. it can be plain HTML or another template
    {{else}}
        //you can use any loader or a simple header
        <h2> Please wait ... </h2>
    {{/if}}
</template>

게시시 사용자 계정 확인

때로는 사용자 로그인을 요구하여 게시를 더욱 안전하게하는 것이 좋습니다. 유성을 통해 이것을 달성하는 방법이 있습니다.

import { Recipes } from '../imports/api/recipes.js';
import { Meteor } from 'meteor/meteor';

Meteor.publish('recipes', function() {
  if(this.userId) {
    return Recipe.find({});
  } else {
    this.ready();  // or: return [];
  }
});

여러 개의 커서 게시

커서 배열을 반환하여 동일한 게시 메서드에서 여러 데이터베이스 커서를 게시 할 수 있습니다.

"하위"커서는 조인으로 취급되어 반응이 없습니다.

Meteor.publish('USER_THREAD', function(postId) {
  let userId   = this.userId;

  let comments = Comments.find({ userId, postId });
  let replies  = Replies.find({ userId, postId });

  return [comments, replies];
});

간행물의 지연 시뮬레이션

실제로 개발 환경에서 지연을 시뮬레이션하기 위해 연결 및 서버 지연이 발생할 수 있습니다. Meteor._sleepForMs(ms); 사용 될수있다

Meteor.publish('USER_DATA', function() {
    Meteor._sleepForMs(3000); // Simulate 3 seconds delay
    return Meteor.users.find({});
});

출판물 병합

발행물을 클라이언트에 병합 할 수 있으므로 단일 커서 내에 모양이 다른 문서가 생성됩니다. 다음 예는 사용자 디렉토리가 앱 사용자를 위해 최소한의 공개 데이터를 게시하고 로그인 한 사용자에 대해보다 자세한 프로필을 제공하는 방법을 나타냅니다.

// client/subscriptions.js  
Meteor.subscribe('usersDirectory');
Meteor.subscribe('userProfile', Meteor.userId());

// server/publications.js  
// Publish users directory and user profile

Meteor.publish("usersDirectory", function (userId) {
    return Meteor.users.find({}, {fields: {
        '_id': true,
        'username': true,
        'emails': true,
        'emails[0].address': true,

        // available to everybody
        'profile': true,
        'profile.name': true,
        'profile.avatar': true,
        'profile.role': true
    }});
});
Meteor.publish('userProfile', function (userId) {
    return Meteor.users.find({_id: this.userId}, {fields: {
        '_id': true,
        'username': true,
        'emails': true,
        'emails[0].address': true,
    
        'profile': true,
        'profile.name': true,
        'profile.avatar': true,
        'profile.role': true,
    
        // privately accessible items, only availble to the user logged in
        'profile.visibility': true,
        'profile.socialsecurity': true,
        'profile.age': true,
        'profile.dateofbirth': true,
        'profile.zip': true,
        'profile.workphone': true,
        'profile.homephone': true,
        'profile.mobilephone': true,
        'profile.applicantType': true
    }});
});


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow