Meteor 订阅数据未显示在 Chrome 控制台中

Meteor subscription data not showing up in Chrome Console

我使用 Differential's meteor-boilerplate 作为一个简单应用的起点。目前它包括 iron-router 1.0.6.

我想处理 /epidodes/5 这样的路由,它根据 episodeNumber 属性显示 Episode 集合中的文档数据。

这是一个示例文档,我可以使用 "meteor shell":

查询它
> Episodes.findOne({episodeNumber: 5})
{ title: 'Ingaus carsur diain nofaex deradisancom.',
description: 'Warde tu alde ationsome an. Ryretyening lowtheland iti combeex. Proset    mafacic lyed oan odiscon alsub isper. Es tiestionthe perconsiy lytion ac tioners inter mycal. Eded uernlarer indis u minca taladpaicar mycom. Cuopbleerpo tem ausin fored alersed mentfa eredal iterning peunbae ex. Oer omade the ican alfor pening. Thederder ingpro reumer esconex. Postions ery terre tionthepen aatcoming tyre beter protioni tionedpe riter. Toreraners typle erntyraa solyi. Themag alrei raat protionaset edcom cypro atapasi afthe iun edterfiassup.',
vimeoId: '80816872',
publishedOn: 510603296882,
free: false,
rating: 2,
episodeNumber: 5,
_id: 'Ewznhyex5puyccSFK' }

但是,它没有出现在 Google Chrome 的控制台中。

相关文件如下:

collections/episodes.js

Episodes = new Mongo.Collection('episodes'); 

routes.js

Router.map(function() {                                                                                              

// some other routes...

// the route where I'm stuck
this.route('episodesShow', {
  path: '/episodes/:episodeNumber',
  waitOn: function() {
    return Meteor.subscribe('episode', this.params.episodeNumber);
  },
  data: function() {
    return Episodes.findOne({episodeNumber: this.params.episodeNumber});
  }
});

server/publications.js

Meteor.publish("episode", function(episodeNumber) {
  check(episodeNumber, String);
  return Episodes.findOne({episodeNumber: episodeNumber});
});

任何有关如何解决此问题以了解为什么数据未显示在客户端的指导都将不胜感激。

尝试return游标而不是数组,例如:

Meteor.publish("episode", function(episodeNumber) {
  check(episodeNumber, String);
  return Episodes.find({episodeNumber: episodeNumber});
});

您不能在您的发布功能中发送非光标。

你可能应该在 server 控制台中有一个错误说

publish function not-returning array of non-cursor 或类似的东西

尝试发布游标

Meteor.publish("episode", function(episodeNumber) {
  check(episodeNumber, String);
  //check whether the episodes are existed or not
  console.log(Episodes.find({episodeNumber: episodeNumber}).count());
  return Episodes.find({episodeNumber: episodeNumber});
});

同时检查您的服务器控制台(终端)是否有错误

我认为问题在于我有另一个名为 episodes 的订阅,它与集合名称相同。

collections/episodes.js

Episodes = new Mongo.Collection('episodes');

server/publications.js

Meteor.publish("episodes", function() {
  return Episodes.find({});
});

我将已发布记录集的名称更改为 episodesList:

Meteor.publish("episodesList", function() {
  return Episodes.find({});
});

为了解决这个问题,我还创建了一个名为 client/main.js 的文件并订阅了 episodesList我已经发布了:

Meteor.startup(function() {
  Meteor.subscribe("episodesList");
});

我一直无法让 episodeNumber 参数在 /episodes/:episodeNumber 路由中工作。我能够让 _id 工作,但这很丑陋,所以我创建了一个 slug 属性并且工作正常。

这是routes.js中的更新定义:

  this.route('singleEpisode', {
    path: '/episodes/:slug',
    waitOn: function() {
      return Meteor.subscribe('episodesList');
    },
    data: function() {
      return Episodes.findOne({slug: this.params.slug});
    }
  });