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});
},
});
答案 0 :(得分:1)
您在路线中订阅了draftsList
两次。第一个订阅没有任何参数,这将使options
成为undefined
而不是对象。只需删除第一个订阅,问题就会消失。
另请注意,check
使用this.userId
可能适用于此情况,但如果您在路线中使用waitOn
,则可能会出现问题。普遍接受的模式是在需要经过身份验证的客户的发布商[]
为this.ready()
时返回this.userId
或undefined
。
答案 1 :(得分:0)
尝试在您的出版物中删除check
this.userId
{}}},您不需要检查此属性的有效性,因为Meteor已经为您执行此操作。
Meteor.publish('draftsList', function (options) {
check(options, {
limit: Number
});
var drafts = Drafts.find(this.userId, options);
return drafts;
});