Meteor JS - 子 id 的异常(不存在的 id)



I20150615-07:11:17.859(9)?子草稿的例外列表 ID GghnkQkdjNSTyHuQs 错误:匹配错误:预期对象,未定义 I20150615-07:11:17.859(9)? at 检查子树 (包/检查/匹配.js:275:1)I20150615-07:11:17.859(9)? 在 检查(包/检查/匹配.js:32:1) I20150615-07:11:17.859(9)? 在 [对象对象]。Meteor.publish.Meteor.users.find.userId [as _handler] (应用程序/服务器/出版物.js:44:3)I20150615-07:11:17.859(9)? 在 maybeAuditArgumentChecks (packages/ddp/livedata_server.js:1617:1) I20150615-07:11:17.859(9)? 在 [对象对象]._.extend._runHandler (包/DDP/livedata_server.js:950:1)I20150615-07:11:17.859(9)?
在 [对象对象]._.extend._startSubscription (包/DDP/livedata_server.js:769:1)I20150615-07:11:17.859(9)?
at [object Object]._.extend.protocol_handlers.sub (包/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});
   },
});

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

另请注意,在这种情况下,将 check 用于this.userId可能有效,但如果在路由中使用waitOn,则可能会导致问题。普遍接受的模式是在需要经过身份验证的客户端的发布者中undefined this.userId时返回[]this.ready()

尝试删除针对出版物中this.userId check,您无需检查此属性的有效性,因为 Meteor 已经为您完成了此操作。

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

最新更新