Meteor MongoDB更新RangeError

时间:2015-09-28 13:57:06

标签: angularjs mongodb meteor

刚刚通过Meteor教程并希望介绍添加,更新和删除函数的方法,这样我就不会直接从客户端编写,并且允许使用Collection.allow执行此操作...使用方法,我总是遇到

RangeError: Maximum call stack size exceeded
    at Object.toString (native)
    at isArguments (http://localhost:3000/packages/es5-shim.js?03b82f907286b5353e3a371eb320635a634fc88b:988:12)
    at Function.keys (http://localhost:3000/packages/es5-shim.js?03b82f907286b5353e3a371eb320635a634fc88b:1051:13)
    at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:155:20)
    at Object.EJSON.clone (http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:528:5)
    at http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:529:22
    at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:157:22)
    at Object.EJSON.clone (http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:528:5)
    at http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:529:22
    at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:157:22)

所以这是我的代码:

方法

Meteor.methods({
  addParty: function (party) {
    // Make sure the user is logged in before inserting a task
    if (!Meteor.userId()) {
      throw new Meteor.Error('not-authenticated');
    }

    party.owner = Meteor.userId();
    party.username = Meteor.user().username;
    party.createdAt = new Date();

    Parties.insert(party);
  },
  removeParty: function (party) {
    // Make sure only the party owner can delete a party
    if (party.owner !== Meteor.userId()) {
      throw new Meteor.Error('not-authorized');
    }
    Parties.remove(party._id);
  },
  updateParty: function (party) {
    // Make sure only the party owner can delete a party
    if (party.owner !== Meteor.userId()) {
      throw new Meteor.Error('not-authorized');
    }
    Parties.update(party._id, party);
  }
});

UI: 在这里,您将看到并更改聚会的详细信息:

<input ng-model="party.name">
<input ng-model="party.description">
<label>Is public</label>
<input type="checkbox" ng-model="party.public">

<button ng-click="save(party)">Save</button>
<button ng-click="reset()">Reset form</button>
<button ui-sref="parties">Cancel</button>

控制器:

$scope.party = $meteor.object(Parties, $stateParams.partyId, false);

$scope.save = function(updatedParty) {
  $meteor.call('updateParty', updatedParty);
};

但是在处理集合时这是有效的:

$scope.addParty = function(newParty){
    $meteor.call('addParty', newParty);
  }

  $scope.remove = function(party){
     $meteor.call('removeParty', party);
  }

当我这样做时,就像它在教程中,从客户端调用它,它可以工作,但我希望将它作为一种方法并更新本文档中的所有字段。我还试图在Meteor.methods.updateParty中删除所有内容,或者使用$ set,仍然会收到错误。我尝试的似乎没什么用。有人看到问题所在吗?

谢谢

更新于2015年10月29日。 17时51

好的,当我改变派对的接收时间:

 $scope.party = $meteor.object(Parties, $stateParams.partyId, false).subscribe('parties');

为:

$scope.party = Parties.findOne($stateParams.partyId);

然后方法调用工作。但是现在不起作用的是当我更新页面时,当我第一次来的时候,派对不再被取回。有什么提示吗?

现在的问题是,这是正确的方法。

我应该使用Parties.findOne获取它...还是可以使用$ meteor.object获取它并定义我可以从客户端写入允许:

Parties.allow({
  update: function (userId, party, fields, modifier) {
    return userId && party.owner === userId;
  }
});

2 个答案:

答案 0 :(得分:1)

所以,我有一个有效的解决方案。

我在模型中创建了一个方法(客户端和服务器之间的共享代码),以便从DB中检索一方:

getOneParty: function(partyId) {
    var party = Parties.findOne(partyId);
    return party;
  },

然后在客户端我有这个:

$meteor.subscribe('parties');
$scope.partyId = $stateParams.partyId; // getting this data from params
$party = $meteor.call('getOneParty', $scope.getReactively('partyId')).then(
      function(data){
        $scope.party = data;
        console.log('successfully got Party: ', data);
      },
      function(err){
        console.log('failed', err);
      }
    );

然后我可以在没有任何问题的情况下调用此函数:

$scope.save = function(updatedParty) {
       $meteor.call('updateParty', updatedParty);
    };

所以,仍然不确定下面的其他方式是否更好,但至少我现在有两个版本工作:)不确定下面的一个,因为客户端然后直接写入DB,这是不是那么安全?

客户代码:

$meteor.subscribe('parties');
$scope.party = $meteor.object(Parties, $stateParams.partyId, false);

更新方法:

$scope.save = function(updatedParty) {
       $scope.party.save().then(function(numberOfDocs){
         console.log('save success doc affected ', numberOfDocs);
       }, function(error){
         console.log('save error', error);
       });
    };

但为此,有必要授权客户这样做。您可以在模型中执行此操作:

Parties.allow({
  update: function (userId, party, fields, modifier) {
    return userId && party.owner === userId;
  }
});

答案 1 :(得分:0)

试试这个:

    $scope.$meteorSubscribe('parties', $stateParams.partyId).then(function() {
        $scope.party= s.$meteorObject(Parties, {
            _id: $stateParams.partyId
        }, false);
    }, function(data) {
        alert("Error loading ");
        console.log(data);
    })

我遇到了同样的问题,不知道为什么。出于某种原因,这为我解决了这个问题。