【问题标题】:meteor: publication / subscription not working流星:发布/订阅不起作用
【发布时间】:2018-12-18 16:20:12
【问题描述】:

我一辈子都想不通为什么这个流星应用程序的客户端没有显示任何内容。我已经尝试了所有相关主题的所有建议,但似乎没有任何效果。我正在使用 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() 函数永远不会返回

这是怎么回事?

【问题讨论】:

  • 另外,如果我在模板中只输出 {{ friends }},我会得到一个 [object] 文本,所以那里有一些东西,它不是 null 或 undefined。
  • 您是否在控制台中遇到任何错误?我认为this.subscribe 不会起作用,因为this 不是Meteor。你可以试试Meteor.subscribe 吗?
  • 复制了您的问题,它在这里有效。您是否可能错过在 main.js 或服务器上的启动 js 文件中包含发布的 js 文件?如果未注册发布,您的订阅将自动解析为ready。您可以使用console.log(Meteor.server.publish_handlers)Meteor.startup 上验证这一点。如果您的酒吧名称未列出,则您错过了包含它。
  • @Jankapunkt - 就是这样!我不敢相信。谢谢。特别是对于调试提示。您应该将其写下来作为答案,也许为遇到相同问题的其他人提供更多详细信息?如果有一个好的调试选项,我自己会发现发布是问题所在。

标签: meteor publish-subscribe


【解决方案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 一起使用,您将大大减少因缺少包含或拼写错误名称而导致的错误。

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 2015-09-02
    • 1970-01-01
    • 2014-05-04
    • 2014-06-16
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多