允许从Meteor中的客户端更新集合

时间:2013-12-30 22:53:37

标签: javascript mongodb meteor

在原型制作中遇到了令人沮丧的疯狂障碍。我需要更新和增加集合内部的数组值。为此,我使用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验证(我没有任何用户,现在不想添加它们) 。我只是原型设计/素描,我不关心安全性。我该怎么办?

2 个答案:

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

您可以选择添加包含错误的回调作为第一个参数,并将响应添加为第二个参数。