我从服务器订阅了一些集合。在我尝试从客户端删除一个文档后,它会显示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。
答案 0 :(得分:0)
您的错误可能与您对原生规则allow
和deny
的配置有关。您的服务器上应该有一段看起来像这样的代码(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是文档。