2012-09-20 49 views
7

誰能告訴我爲什麼下面的代碼會拋出以下錯誤? :爲什麼Meteor會抱怨已經定義了一個集合的插入方法?

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

我是新來的流星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 

我運行流星版本0.4.0(8f4045c1b9)

在此先感謝您的幫助!

+2

是否有可能在某處發佈您的完整項目?我認爲你的問題是定義收集兩次..也許你沒有刪除原來的.js文件? –

回答

0

這似乎是一個配置問題與coffeelint(全局安裝npm)。

我最初安裝了coffeelint來檢查我的coffeescript代碼是否正確,沒有錯誤。

我安裝coffeelint按照說明書用:單機運行對.coffee文件時

sudo npm install -g coffeelint

coffeelint工作的罰款。

但是,當運行任何帶有coffeescript包的Meteor項目時,我得到了上述錯誤。

突發奇想,我認爲這個錯誤可能是由於與我現有的節點安裝衝突。

我決定與先卸載coffeelint:

sudo npm uninstall -g coffeelint

,然後刪除先前流星生成leaderboard.js文件。

重新啓動meteor後,上面的coffeescript示例按預期工作,沒有錯誤。

+0

「,然後刪除之前流星生成的leaderboard.js文件」 - 正如其他人所說的,這個錯誤是由流星實例化相同的集合兩次引起的。 –

0

嘗試移動(即複製和刪除原)

Players = new Meteor.Collection("players")

一個時間下if Meteor.is_client 及以下if Meteor.is_server

其他時間我不知道爲什麼,因爲我是新Meteor也是如此,但我認爲服務器端需要它自己的引用,以及客戶端 ,儘管在範圍之外聲明也應該這樣做(也許是一個bug,記住它們仍然是0.5。 0預覽,這使得m e想想你可能想升級並嘗試一些新版本的智能軟件包,看起來你正在使用0.4),但是當我的服務器中的文件無法識別任何東西時,我定義了meteor的根目錄推送這些文件到客戶端和服務器),我定義了服務器自己的引用,並且我得到了同樣的錯誤,並且直到我將引用的「公共」聲明提供給服務器和客戶端各自的副本,沒有任何工作。

希望幫助...

+0

謝謝周杰倫 - 我發現了我的問題的來源,並回答了我自己的問題。問題是由於與已安裝版本的coffeelint衝突(請參閱下面的詳細信息)。 – AlexEberts

12

你也會得到這個錯誤,不管使用CoffeeScript的或普通的JavaScript,如果你複製你的文件。例如,將源文件複製到名爲Backup的子目錄會產生此錯誤,因爲Meteor合併了子目錄中的文件。

+0

謝謝,這解決了我的一天。我有一個SublimeText插件配置錯誤,它在.coffee上生成了每個.js文件的保存操作。因此我重複了客戶端和服務器文件。 – Hamal000

+0

謝謝,爲我節省了大量的時間。 – jamesscaggs

相關問題