meteor - 如何更新订阅文档?

时间:2015-07-09 11:10:14

标签: mongodb meteor meteorite

我从服务器订阅了一些集合。在我尝试从客户端删除一个文档后,它会显示remove failed: Access denied。所以我试图通过Meteor.call从服务器端删除它,它工作正常但客户端有相同数量的文档。

下面的代码会更好地解释你。

ClientJS:

Template.Message.onCreated(function () {
  this.autorun(function () {
    this.subscription = Meteor.subscribe('mymessage');
  }.bind(this));
});

Template.Message.onRendered(function () {
  this.autorun(function () {
    if (this.subscription.ready()) {
      console.log(Message.find().count()); //10
     }
  }.bind(this));
});

ServerJS:

  Meteor.publish('mymessage', function() {
    console.log(Message.find().count()); //10
    return Message.find();
  }); 

在点击事件中

ClientJS:

Meteor.call("deletemsg", this._id._str, function(error, result){ 
 if(!error){
     console.log(Message.find().count()); // 10, Want to update document here.
   }
});

Serverjs

  Meteor.methods({
    deletemsg: function (delmsg) {
      if(Message.remove({"_id":new Mongo.ObjectID(delmsg)})){
       console.log(Message.find().count()); //9
       return true;
      } else {
        throw new Meteor.Error("some error message");
      }
     }
  });

注意:我使用的是现有的Mongodb。

2 个答案:

答案 0 :(得分:0)

您的错误可能与您对原生规则allowdeny的配置有关。您的服务器上应该有一段看起来像这样的代码(Message是您的集合名称):

Message.allow({
    insert: function (userId, doc) {
        //allow rule
    },

    update: function (userId, doc, fields, modifier) {
        //allow rule
    },

    remove: function (userId, doc) {
        //allow rule
    }
});

或等同于deny。看起来您的当前用户不允许从集合中删除(即删除)消息。

快速旁注:您无需将订阅包装在autorun中。如果使用iron-router,则可以使用内置函数进行订阅。在路线选项中,您可以添加以下内容:

action: function() {
    if(this.isReady()) { this.render(); } else { this.render("loading");}
},

isReady: function() {


    var subs = [
        Meteor.subscribe("yourPublication")
    ];
    var ready = true;
    _.each(subs, function(sub) {
        if(!sub.ready())
            ready = false;
    });
    return ready;
},

答案 1 :(得分:0)

您不需要使用_str,因为_id已经是字符串。

  

客户端JS

Meteor.call("deletemsg", this._id, function(error, result){  //Remove _str from here
 if(!error){
     console.log(Message.find().count()); // 10, Want to update document here.
   }
});
  

服务器JS

删除文档时,只需要传递id,而不是对象。

 Meteor.methods({
    deletemsg: function (delmsg) {
      if(Message.remove(delmsg)){
       console.log(Message.find().count()); //9
       return true;
      } else {
        throw new Meteor.Error("some error message");
      }
     }
  });
  

允许CRUD操作。

如果上述方法不起作用,请尝试从服务器块中为该集合允许CRUD操作。 Here是文档。