【发布时间】:2017-04-09 04:12:16
【问题描述】:
我有一个用户发布和订阅问题。当我单击用户名时,它应该显示: [1] 用户的个人资料图片; [2] 该用户的所有帖子。
但它只显示加载微调器屏幕和以下错误。如果我尝试几次刷新或重新单击名称,页面最终会加载一些滞后。
我怀疑存在客户端竞争情况,但我尝试添加 (!this._id) return [ ] 或 this.ready();,帖子会在屏幕上闪烁一次,此后不再显示。我无法删除检查,因为它会引发无检查错误。
如果有任何地方可以简化显示用户的帖子,请告知。谢谢!
浏览器控制台出错:
Tracker 重新计算函数的异常:meteor.js:930:11
未定义的流星.js:932:11
终端上显示的关键错误的选定部分:
> I20170409-11:51:58.787(8)? Exception from sub user id > BRFKAiwEXKootpbwY Error: Match error: Expected string, got null > (packages/check/match.js:34:1) I20170409-11:51:58.788(8)? at > Subscription.<anonymous> (server/server.js:86:2) > I20170409-11:51:58.788(8)? at Subscription.prepareOptions > (packages/reywood_publish-composite/packages/reywood_publish-composite.js:440:1) > I20170409-11:51:58.788(8)? at Subscription._handler > (packages/reywood_publish-composite/packages/reywood_publish-composite.js:408:1) > I20170409-11:51:58.788(8)? at packages/check/match.js:107:1 > at Object.exports.Match._failIfArgumentsAreNotAllChecked > (packages/check/match.js:106:1) I20170409-11:51:58.788(8)? at > maybeAuditArgumentChecks > Match failed [400]
服务器发布
Meteor.publish('userDetails', function() {
var fields = {
username : 1,
emails : 1,
profile : 1,
md5hash : 1
};
return Meteor.users.find( {}, { fields: fields });
});
Meteor.publishComposite('user', function (_id) {
check(_id, String); // cant remove this check, throws error
//if (!this._id) return this.ready(); or [] doesnt work
return {
find: function() {
return Meteor.users.find({ _id: _id }, {
fields: {
username : 1,
emails : 1,
profile : 1,
md5hash : 1
}
});
},
children: [
{
find: function(user) {
return Posts.find({ userId: user._id });
}
}
]
};
});
路由器代码
Router.route('/users/:_id', {
name: 'users.show',
onBeforeAction: function () {
if( this.params._id === Meteor.userId() ){
Router.go('profile');
} else {
this.next();
}
}
});
页面js
Template.usersShow.onCreated(function(){
var self = this;
self.autorun(function(){
self.subscribe('user', Router.current().params._id);
});
});
Template.usersShow.helpers({
user: function () {
return Meteor.users.findOne({ _id: Router.current().params._id });
},
posts: function () {
return Posts.find({ userId: Router.current().params._id });
}
});
【问题讨论】:
标签: javascript node.js meteor publish-subscribe