流星:发布/订阅无效

时间:2018-07-10 18:10:14

标签: meteor publish-subscribe

我无法为自己的一生弄清楚为什么在此流星应用程序中没有任何客户端显示。我已经尝试了所有相关主题中的所有建议,但似乎没有任何效果。我正在使用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>

显示“朋友列表”标头,因此subscriptionsReady调用返回,但是我没有任何数据(验证数据是否存在于数据库中)。

我也尝试过将订阅移动到路由器中(使用ostrio:flow-router-extra),并且在添加订阅时,waitOn()函数永远不会返回

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

如果您缺少在服务器上包含出版物的信息,则客户端的订阅将立即为“就绪”,但不会出现错误消息。

在创建带有模板级订阅的模板时,这可能会引起很多混乱。

为了检查发布是否存在,可以在启动(未记录)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结合使用,您将大大减少缺少包含或名称拼写错误的错误。