【问题标题】:Meteor mongo: Untrusted code may only update documents by ID. [403]Meteor mongo:不受信任的代码只能通过 ID 更新文档。 [403]
【发布时间】:2015-05-01 02:05:36
【问题描述】:

下面的 sn-p 给了我错误:

Households.update({
    _id: Meteor.user().profile.myHousehold, 
    "shoppingList.name" : this.name}, 
    {"$set" : {
         "shoppingList.$.checked" : checked
    }
});

什么?我正在按 id 更新。作为一种解决方法,我当然可以简单地替换整个数组shoppingList,但这将是蛮力的。

【问题讨论】:

  • myHousehold 等于什么?很可能它没有设置?
  • 只是对用户所在家庭的引用。它是家庭的 UUID。

标签: mongodb meteor


【解决方案1】:

使用具有延迟补偿的复杂更新/删除选择器的正确模式是使用 Meteor 方法。

共享代码:

Meteor.methods({

  setHouseholdChecked: function(shoppingListName, checked) {

    check(this.userId, String);
    check(shoppingListName, String);
    check(checked, Boolean);

    Households.update({
      _id: Meteor.user().profile.myHousehold, 
      "shoppingList.name" : shoppingListName
    }, {
      $set: {
        "shoppingList.$.checked" : checked
      }
    });

  }

});

客户端代码:

Meteor.call('setHouseholdChecked', this.name, checked);

【讨论】:

  • 就是这样!非常感谢!
  • 在这种情况下没有 3 种方式绑定,在服务器端允许/拒绝:/
【解决方案2】:

对于仅限客户端的解决方案,您可以依靠这个技巧:

var households = Houseolds.find({
  _id: Meteor.user().profile.myHousehold,
  "shoppingList.name" : this.name
});
households.forEach(function(houseold){
  Households.update(houseold._id, {
    $set: {
      "shoppingList.$.checked" : checked
    }
  });
});

【讨论】:

  • 这可能会产生与预期不同的结果,具体取决于"shoppingList.name" : this.name 是否无关紧要。
  • 这是不同的。在这里,shoppingList 中的每个项目都被设置为选中,而在我的原始代码中,只有具有正确名称的项目被选中。
  • 你说得对,编辑了我的答案,如果相关的话,可以提供一个仅适用于客户的替代解决方案。
猜你喜欢
  • 2015-07-12
  • 2013-12-11
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2018-12-28
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多