2015-06-14 19 views
3

I20150615-07:11:17.859(9)? Exception from sub draftsList id GghnkQkdjNSTyHuQs Error: Match error: Expected object, got undefined I20150615-07:11:17.859(9)? at checkSubtree (packages/check/match.js:275:1) I20150615-07:11:17.859(9)? at check (packages/check/match.js:32:1) I20150615-07:11:17.859(9)? at [object Object].Meteor.publish.Meteor.users.find.userId [as _handler] (app/server/publications.js:44:3) I20150615-07:11:17.859(9)? at 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)? Sanitized and reported to the client as: Match failed [400]流星JS - 从子id(ID不存在)的例外

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

问题是当它说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}); 
    }, 
}); 

回答

1

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

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

0

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

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