수색…
비고
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
}});
});