流星:发布/订阅不工作

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,您将大大减少丢失包含或拼写错误的错误。