【问题标题】:Meteor: subscribe with query failsMeteor:使用查询订阅失败
【发布时间】:2015-11-28 05:24:45
【问题描述】:

在我的流星应用程序中,我正在实现在用户之间发送消息的功能。 在我的应用中,我有一个路由和模板,用于显示发送给用户的所有消息。

控制器代码:

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

可能有什么问题?

【问题讨论】:

  • 您可以发布您的未读消息订阅吗?您说“...或删除对未读消息的订阅...”我怀疑订阅以某种方式覆盖了您想要的数据。
  • 是的,Deps.autorun(function() { if (Meteor.user()) { Meteor.subscribe("current_user_data"); Meteor.subscribe("unreadMessages"); } });

标签: javascript mongodb meteor


【解决方案1】:
  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);
    
    });
    

【讨论】:

  • 感谢您的解决方案!我知道问题在于投影。如果它是空的,那么我有我的问题。你能解释一下为什么吗?
  • 我还有另一个问题 - 如果我将投影添加到我的 unreadMessages 订阅中,那么所有已读消息都会再次消失。但是没有它,我的消息顺序不正确(我首先有未读消息,但我希望消息按时间顺序显示)
【解决方案2】:

我认为你需要:

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 上)

它将向您显示发送到浏览器的所有内容,以便您更轻松地进行故障排除。

【讨论】:

  • 在路由器代码中也将 id 作为参数传递给您的订阅
  • 谢谢,但没有帮助((我找到了问题的根源——我在这张桌子上有两个活跃的订阅,我在问题中详细描述了它。
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多