为什么Meteor抱怨已经定义了集合的插入方法?

时间:2012-09-20 23:43:02

标签: collections coffeescript meteor

任何人都可以告诉我为什么下面的代码会引发以下错误? :

Error: A method named '/players/insert' is already defined 

我是Meteor和coffeescript的新手所以我可能会忽略一些简单的事情。

这是我对coffeescript的排行榜示例的端口:

###
Set up a collection to contain player information. On the server,
it is backed by a MongoDB collection named "players."
###
Players = new Meteor.Collection("players")

if Meteor.is_client
  Template.leaderboard.players = ->
    Players.find({}, {sort: {score: -1, name: 1}})

  Template.leaderboard.selected_name = ->
    player = Players.findOne(Session.get "selected_player")
    player and player.name

  Template.player.selected = -> if Session.equals("selected_player", this._id) then "selected" else ''

  Template.leaderboard.events = {
    'click input.inc': ->
      Players.update(Session.get("selected_player"), {$inc: {score: 5}})
  }

  Template.player.events = {
    'click': ->
      Session.set("selected_player", this._id)
  }

# On server startup, create some players if the database is empty.
if Meteor.is_server
  Meteor.startup ->
    if Players.find().count() is 0
      names = [
                "Ada Lovelace"
                "Grace Hopper"
                "Marie Curie"
                "Carl Friedrich Gauss"
                "Nikola Tesla"
                "Claude Shannon"
              ]
      Players.insert({name: name, score: Math.floor(Math.random()*10)*5}) for name in names

完整堆栈跟踪如下:

[[[[[ ~/dev/meteor/leaderboard ]]]]]

Running on: http://localhost:3000/

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: A method named '/players/insert' is already defined
    at app/packages/livedata/livedata_server.js:744:15
    at Function.<anonymous> (app/packages/underscore/underscore.js:84:24)
    at [object Object].methods (app/packages/livedata/livedata_server.js:742:7)
    at new <anonymous> (app/packages/mongo-livedata/collection.js:111:13)
    at app/leaderboard.js:4:11
    at /Users/alex/dev/meteor/leaderboard/.meteor/local/build/server/server.js:109:21
    at Array.forEach (native)
    at Function.<anonymous> (/Users/alex/dev/meteor/leaderboard/.meteor/local/build/server/underscore.js:76:11)
    at /Users/alex/dev/meteor/leaderboard/.meteor/local/build/server/server.js:95:7
Exited with code: 1

我正在运行Meteor版本0.4.0(8f4045c1b9)

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:12)

如果您复制了文件,无论使用coffeescript还是普通javascript,您都会收到此错误。例如,将源文件复制到名为Backup的子目录会产生此错误,因为Meteor会合并子目录中的文件。

答案 1 :(得分:0)

这似乎是coffeelint的配置问题(使用npm全局安装)。

我最初安装了coffeelint来检查我的coffeescript代码是否正确且没有错误。

我按照以下说明安装了coffeelint:

sudo npm install -g coffeelint

coffeelint在针对.coffee文件独立运行时工作正常。

但是,当运行任何添加了coffeescript包的Meteor项目时,我收到了上述错误。

一时兴起,我认为错误可能是由于与我现有的节点安装冲突造成的。

我决定先用:

卸载coffeelint

sudo npm uninstall -g coffeelint

然后删除以前流星生成的leaderboard.js文件。

重新启动meteor后,上面的coffeescript示例按预期正常运行,没有错误。

答案 2 :(得分:0)

尝试移动(即复制和删除原文)

Players = new Meteor.Collection("players")

低于if Meteor.is_client一次 还有一次低于if Meteor.is_server

我不知道为什么,因为我也是Meteor的新手,但这对我有用,我认为服务器端需要它自己的参考,以及客户端, 虽然在范围之外声明应该做同样的事情(也许是一个bug,记住它们仍然在0.5.0预览,这让我觉得你可能想升级并尝试一些新版本的智能包,它看起来像你'使用0.4),但是当我服务器中的文件无法识别任何内容时我定义了meteor的根目录(将这些文件推送到客户端和服务器),我定义了服务器自己的引用,我得到了同样的错误,直到我移动了引用的“公共”声明,给每个服务器和客户端自己的副本,没有任何效果。

希望这有助于......