Meteor方法和Mongo $ inc非数字错误

时间:2015-03-03 16:47:41

标签: mongodb meteor

我正在浏览David Turnbull撰写的你的第一个流星应用methods章节。

我有一种更新数据库中字段的方法。

'modifyPlayerScore': function(selectedPlayer, scoreValue){ PlayersList.update(selectedPlayer, {$inc: {score: scoreValue} }); }

从事件函数

调用这些方法
'click .increment': function(){

    var selectedPlayer = Session.get('selectedPlayer');

    Meteor.call('modifyPlayerScore', selectedPlayer, 5);

 },
 'click .decrement': function(){

    var selectedPlayer = Session.get('selectedPlayer');

    Meteor.call('modifyPlayerScore', selectedPlayer, -5);

  }

当我在应用程序中使用此功能时,我在终端

中看到错误
Exception while invoking method 'modifyPlayerScore' MongoError: Modifier $inc allowed for numbers only

我使用了console.log语句来打印scoreValue变量,它显示5或-5。我有一种感觉,这可能是一个字符串,而不是一个数字,但我不知道如何解决这个错误。在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

当您将分数添加到玩家时:

PlayersList.insert({name: 'test', score:3});

我想,你可以提高分数。但现在不行了。

这是因为您传递了一个文本参数而不是整数。 添加播放器时,应使用parseInt():

 PlayersList.insert({
  name: name,
  score: parseInt(score),
  createdBy: Meteor.userId()
})

现在,它应该工作。或者您可以使用parseInt()来设置score

答案 1 :(得分:2)

您应该将Meteor.method更改为此。

$inc上移除5静态并放置第二个参数(scoreValue)。

该方法应如下所示。

modifyPlayerScore': function(selectedPlayer, scoreValue){
    PlayersList.update(selectedPlayer, {$inc: {score: scoreValue} });
}

现在你可以这样打电话了。

Meteor.call('modifyPlayerScore', selectedPlayer, 5);

其中 5 现在是scoreValue参数

<强>更新

我让this working MeteorPad检查你有这样的一切。

NEW METEORPAD

我根据this meteor创建了gist个pad,以及它的所有功能。

答案 2 :(得分:1)

我在上面由yoh建议的PlayerList.insert中的分数上使用了parse int,它适用于新条目。分数的旧条目仍保存为字符串,因此增量和减量不起作用。删除旧条目并重新开始,它应该有效。