在我的meteor应用程序中,我正在实现在用户之间发送消息的功能。 在我的应用程序中,我有一个路径和模板,显示发送给用户的所有消息。
控制器代码:
this.UserMessagesController = RouteController.extend({
template: "UserMessages",
waitOn: function() {
return Meteor.subscribe("userMessages");
},
data: function() {
return {
"messages": UserMessages.find({to: Meteor.userId()}, {sort: {time: -1}} )
}
}
});
}
});
在服务器端,我有一个发布功能
Meteor.publish("userMessages", function() {
var userId = this.userId;
return UserMessages.find({to: userId}, {});
});
此外,我对未读消息进行全球订阅:
Deps.autorun(function() {
if (Meteor.user()) {
Meteor.subscribe("unreadMessages");
}
});
Meteor.publish("unreadMessages", function() {
return UserMessages.find({to: this.userId, read: undefined}, {});
});
问题是:我只能看到在模板上呈现的未读消息(以及仅在客户端minimongo集合中的未读消息)
但是,如果我从发布功能中删除过滤器{to:userId}或删除未读消息的订阅,我可以完美地看到每条消息!
PS:我试图调试发布函数设置断点并评估UserMessages.find({to:userId},{})。fetch(),我得到了包含15条消息的绝对正确的数组。
PPS:我在服务器端和客户端都没有收到错误消息
可能有什么问题?
答案 0 :(得分:0)
我认为你需要:
Meteor.publish("userMessages", function(id) {
return UserMessages.find({to: id}, {});
});
然后 传递订阅请求中的id参数
waitOn: function() {
return Meteor.subscribe("userMessages", Meteor.userId());
},
但是为了解决这些问题,你最好的朋友是MeteorToys来调试这些东西: 他们有免费版本,
meteor add meteortoys:allthings
并点击CRTL + M(在Mac OS上)
它会向您显示发送到浏览器的所有内容,以便您可以更轻松地进行故障排除。
答案 1 :(得分:0)
订阅
this.UserMessagesController = RouteController.extend({
template: "UserMessages",
subscriptions: function(){
return [
Meteor.subscribe("user.message")
]
},
data: function() {
return UserMessages.find();
})
发布
Meteor.publish("user.message", function(){
var criteria = {};
var projection = {};
var userId = this.userId;
_.extend(criteria, {to: userId});
_.extend(projection, {
sort: {
time: -1
}
});
return UserMessages.find(criteria, projection);
});