流星:发布/订阅不工作
meteor: publication / subscription not working
我这辈子都想不通为什么这个 meteor 应用程序什么都没有显示 client-side。我已经尝试了所有相关主题中的所有建议,但似乎没有任何效果。我正在使用 msavin:mongol,尽管 console.log() 调试输出表明它存在于当前条目数中,但我什至根本看不到客户端上的订阅。
/imports/api/friends.js:
export const Friends = new Mongo.Collection('friends');
Friends.deny({ insert() { return true; }, update() { return true; }, remove() { return true; } }); // access to collections only through method calls
/imports/api/server/friends.js:
import { Meteor } from 'meteor/meteor';
import { Friends } from '../friends.js';
Meteor.publish('friends.all', function(){
return Friends.find();
})
/imports/ui/pages/friends.js:
import { Friends } from '/imports/api/friends.js';
import './friends.html';
Template.friends.onCreated(function() {
this.subscribe('friends.all');
});
Template.friends.helpers({
friends: ()=>{ return Friends.find(); }
});
/imports/ui/pages/friends.html:
<template name="friends">
<h1 class="ui header">Friends</h1>
{{#if Template.subscriptionsReady}}
<h2 class="ui heder">friends list:</h2>
<div class="ui list">
{{#each friend in friends}}
<div class="item">{{friend.name}} ({{friend.email}})</div>
{{/each}}
</div>
{{/if}}
</template>
"friends list" header 出现,所以 subscriptionsReady 调用 returns,但我没有得到任何数据(已验证数据存在于数据库中)。
我也试过将订阅移动到路由器中(使用 ostrio:flow-router-extra),当我添加订阅时 waitOn() 函数从不 returns
这是怎么回事?
如果您没有在服务器上包含您的出版物,那么您客户的订阅将立即 'ready' 但不会有错误消息。
这会在创建带有模板级订阅的模板时造成很多混乱。
为了检查发布是否存在,您可以在启动(未记录的)server.publish_handlers
数组后在服务器上使用。它保留已注册出版物的记录。
Meteor.startup( () => {
console.log( Meteor.server.publish_handlers );
});
如果您设计的 api 能够跟踪其预期的出版物,这将非常方便:
friendsdef.js
// definition file for Friends collection and it's
// surrounding functionality
export const FriendsDef = {
collectionName: 'friends',
schema: { ... },
methods: { ... },
publications: {
all: {
name: 'friends.all'
}
}
}
someServerStartup.js
// make sure on startup, that all intended
// publications are registered
Meteor.startup( () => {
Object.values( FriendsDef.publications).forEach( pub => {
if (!Meteor.server.publish_handlers[pub.name]) {
throw new Error('publication should exist, but does not');
}
});
});
同样适用于 method_handlers
方法。使用这些具有明确定义的数据结构 API,您将大大减少丢失包含或拼写错误的错误。
我这辈子都想不通为什么这个 meteor 应用程序什么都没有显示 client-side。我已经尝试了所有相关主题中的所有建议,但似乎没有任何效果。我正在使用 msavin:mongol,尽管 console.log() 调试输出表明它存在于当前条目数中,但我什至根本看不到客户端上的订阅。
/imports/api/friends.js:
export const Friends = new Mongo.Collection('friends');
Friends.deny({ insert() { return true; }, update() { return true; }, remove() { return true; } }); // access to collections only through method calls
/imports/api/server/friends.js:
import { Meteor } from 'meteor/meteor';
import { Friends } from '../friends.js';
Meteor.publish('friends.all', function(){
return Friends.find();
})
/imports/ui/pages/friends.js:
import { Friends } from '/imports/api/friends.js';
import './friends.html';
Template.friends.onCreated(function() {
this.subscribe('friends.all');
});
Template.friends.helpers({
friends: ()=>{ return Friends.find(); }
});
/imports/ui/pages/friends.html:
<template name="friends">
<h1 class="ui header">Friends</h1>
{{#if Template.subscriptionsReady}}
<h2 class="ui heder">friends list:</h2>
<div class="ui list">
{{#each friend in friends}}
<div class="item">{{friend.name}} ({{friend.email}})</div>
{{/each}}
</div>
{{/if}}
</template>
"friends list" header 出现,所以 subscriptionsReady 调用 returns,但我没有得到任何数据(已验证数据存在于数据库中)。
我也试过将订阅移动到路由器中(使用 ostrio:flow-router-extra),当我添加订阅时 waitOn() 函数从不 returns
这是怎么回事?
如果您没有在服务器上包含您的出版物,那么您客户的订阅将立即 'ready' 但不会有错误消息。
这会在创建带有模板级订阅的模板时造成很多混乱。
为了检查发布是否存在,您可以在启动(未记录的)server.publish_handlers
数组后在服务器上使用。它保留已注册出版物的记录。
Meteor.startup( () => {
console.log( Meteor.server.publish_handlers );
});
如果您设计的 api 能够跟踪其预期的出版物,这将非常方便:
friendsdef.js
// definition file for Friends collection and it's
// surrounding functionality
export const FriendsDef = {
collectionName: 'friends',
schema: { ... },
methods: { ... },
publications: {
all: {
name: 'friends.all'
}
}
}
someServerStartup.js
// make sure on startup, that all intended
// publications are registered
Meteor.startup( () => {
Object.values( FriendsDef.publications).forEach( pub => {
if (!Meteor.server.publish_handlers[pub.name]) {
throw new Error('publication should exist, but does not');
}
});
});
同样适用于 method_handlers
方法。使用这些具有明确定义的数据结构 API,您将大大减少丢失包含或拼写错误的错误。