在原型制作中遇到了令人沮丧的疯狂障碍。我需要更新和增加集合内部的数组值。为此,我使用MongoDB语法访问该集合,如下所示:
Players.update({_id: Session.get('p1_id'), 'opponents.$.id' : Session.get('p2_id')},
{$inc: {
'games_played' : 1
}}
);
当这次运行时,我收到错误消息:未捕获错误:不允许。不受信任的代码只能按ID更新文档。 [403]
现在,我搜索了这个,我知道它在更新中出现了,为什么他们只允许通过id更新。但我的问题是我似乎无法找到解决办法。我尝试通过将其添加到if (Meteor.isServer)
:
Players.allow({
insert: function(userId, doc, fields, modifier){
return true;
},
update: function(userId, doc, fields, modifier){
return true;
},
remove: function(userId, doc, fields, modifier){
return true;
}
});
似乎没有什么工作,我发现的所有示例都谈到使用Meteor方法(不确定那是什么)或正在进行userId验证(我没有任何用户,现在不想添加它们) 。我只是原型设计/素描,我不关心安全性。我该怎么办?
答案 0 :(得分:1)
以下是如何将其转化为方法:
Meteor.methods({
incrementGames: function (player1Id, player2Id) {
check(player1Id, Meteor.Collection.ObjectID);
check(player2Id, Meteor.Collection.ObjectID);
Players.update({
_id: player1Id,
'opponents.$.id': player2Id
}, {
$inc: {
'games_played' : 1
}
}, function(error, affectedDocs) {
if (error) {
throw new Meteor.Error(500, error.message);
} else {
return "Update Successful";
}
});
}
});
在您的客户端:
Meteor.call("incrementGames", Session.get('p1_id'), Session.get('p2_id'), function(error, affectedDocs) {
if (error) {
console.log(error.message);
} else {
// Do whatever
}
});
答案 1 :(得分:1)
您的更新错误。 update方法的第一个参数应该是id。第二个参数是包含修饰符的对象。
Players.update(playerId, {$inc:{games_played:1}});
您可以选择添加包含错误的回调作为第一个参数,并将响应添加为第二个参数。