Meteor JS - 来自sub id的异常(不存在的id)

时间:2015-06-14 22:16:11

标签: javascript meteor publish-subscribe

  

I20150615-07:11:17.859(9)? sub draftsList id的例外情况   GghnkQkdjNSTyHuQs错误:匹配错误:预期的对象,未定义   I20150615-07:11:17.859(9)?在checkSubtree   (packages / check / match.js:275:1)I20150615-07:11:17.859(9)?在   check(packages / check / match.js:32:1)I20150615-07:11:17.859(9)?在   [object Object] .Meteor.publish.Meteor.users.find.userId [as _handler]   (app / server / publications.js:44:3)I20150615-07:11:17.859(9)?在   maybeAuditArgumentChecks(packages / ddp / livedata_server.js:1617:1)   I20150615-07:11:17.859(9)? at [object Object] ._。extend._runHandler   (packages / ddp / livedata_server.js:950:1)I20150615-07:11:17.859(9)?
  at [object Object] ._。extend._startSubscription   (packages / ddp / livedata_server.js:769:1)I20150615-07:11:17.859(9)?
  at [object Object] ._。extend.protocol_handlers.sub   (packages / ddp / livedata_server.js:582:1)I20150615-07:11:17.859(9)?
  at packages / ddp / livedata_server.js:546:1 I20150615-07:11:17.860(9)?   消毒并向客户报告:匹配失败[400]

我正在研究一个流星项目,我在终端上遇到了这个奇怪的错误。

问题是当它显示Exception from sub draftsList id GghnkQkdjNSTyHuQs Error: Match error: Expected object, got undefined时,id总是在页面刷新时更改,并且不在我的数据库中(无处可见)。

问题是,一切正常。

这是我的publication-subscription

公开

Meteor.publish('draftsList', function (options) {   
  check(this.userId, String);
  check(options, {
    limit: Number
  });

  var drafts = Drafts.find({'user._id': this.userId}, options);

  return drafts;
});

订阅

Router.route('/posts/:_id', {
  name: 'postPage',
  // limit: function () {
  //   return
  // }
  subscriptions: function () {
    return [
      Meteor.subscribe('singlePost', this.params._id),
      Meteor.subscribe('userStatus'),
      Meteor.subscribe('draftsList'),
      Meteor.subscribe('draftsList', {
        limit: Number(Session.get('draftsLimit'))
      }),
      Meteor.subscribe('comments', {
          postId: this.params._id
        }, {
          limit: Number(Session.get('commentLimit'))
      }),
      Meteor.subscribe('answers', {
          postId: this.params._id
        }, {
          limit: Number(Session.get('answerLimit'))
      })
    ];
  },
  data: function() {
    return Posts.findOne({_id:this.params._id});
   },
});

2 个答案:

答案 0 :(得分:1)

您在路线中订阅了draftsList两次。第一个订阅没有任何参数,这将使options成为undefined而不是对象。只需删除第一个订阅,问题就会消失。

另请注意,check使用this.userId可能适用于此情况,但如果您在路线中使用waitOn,则可能会出现问题。普遍接受的模式是在需要经过身份验证的客户的发布商[]this.ready()时返回this.userIdundefined

答案 1 :(得分:0)

尝试在您的出版物中删除check this.userId {}}},您不需要检查此属性的有效性,因为Meteor已经为您执行此操作。

Meteor.publish('draftsList', function (options) {   
  check(options, {
    limit: Number
  });
  var drafts = Drafts.find(this.userId, options);
  return drafts;
});