Meteor:订阅查询失败

时间:2015-09-02 15:48:46

标签: javascript mongodb meteor

在我的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:我在服务器端和客户端都没有收到错误消息

可能有什么问题?

2 个答案:

答案 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)

  1. 订阅

    this.UserMessagesController = RouteController.extend({
    template: "UserMessages",
    
    subscriptions: function(){
    
    return [
        Meteor.subscribe("user.message")
      ]
    },
    
    data: function() {
    
     return UserMessages.find();
    
    })
    
  2. 发布

    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);
    
    });