2012-09-20 13 views
7

¿Alguien me puede decir por qué el siguiente código arroja el siguiente error? :¿Por qué Meteor se queja de que ya se ha definido un método de inserción para una colección?

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

Soy nuevo en Meteor and coffeescript por lo que puede estar pasando por alto algo simple.

Aquí es mi puerto de la tabla de clasificación ejemplo a 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 

El seguimiento de la pila completa es la siguiente:

[[[[[ ~/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 

estoy ejecutando la versión 0.4.0 Meteor (8f4045c1b9)

¡Gracias de antemano por su ayuda!

+2

¿Es posible publicar su proyecto completo en alguna parte? Creo que tu problema es definir la colección dos veces ... ¿quizás no has eliminado el archivo .js original? –

Respuesta

0

Esto parece ser un problema de configuración con coffeelint (instalado globalmente con npm).

Originalmente instalé coffeelint para verificar que el código de mi coffeescript era correcto y no tenía errores.

He instalado coffeelint de acuerdo con las instrucciones:

sudo npm install -g coffeelint

coffeelint funcionó bien cuando se ejecuta independiente contra .coffee archivos.

Sin embargo, al ejecutar cualquier proyecto Meteor con el paquete coffeescript agregado, recibí el error anterior.

Por un capricho, pensé que el error podría deberse a un conflicto con la instalación de mi nodo existente.

decidí desinstalar primero con coffeelint:

sudo npm uninstall -g coffeelint

y luego se elimina el archivo leaderboard.js previamente meteoro-generado.

Después de volver a iniciar meteor, el ejemplo anterior de coffeescript funcionó como se esperaba sin errores.

+0

"y luego eliminó el archivo leaderboard.js generado anteriormente por meteoritos" - como han dicho otros, este error se debe a que Meteor instancia la misma colección dos veces. –

0

intento en movimiento (es decir, copiar y borrar el original)

Players = new Meteor.Collection("players")

un tiempo por debajo de if Meteor.is_client y otra vez por debajo if Meteor.is_server

No sé exactamente por qué, ya que soy nuevo para Meteor también, pero eso funcionó para mí, supongo que el lado del servidor necesita su propia referencia, así como el cliente, aunque declarar fuera del alcance debería hacer lo mismo (tal vez un error, recuerde que todavía están en 0.5. 0 vista previa, que hace m Creo que puede querer actualizar y probar algunos paquetes inteligentes nuevos que están con la nueva versión, parece que está usando 0.4), pero cuando los archivos en mi servidor no reconocían nada, definí el directorio raíz del meteoro (que empuja estos archivos al cliente y al servidor), definí la referencia del servidor y recibí el mismo error, y hasta que moví la declaración 'pública' de la referencia para dar al servidor y al cliente su propia copia, nada funcionó .

Esperemos que ayuda ...

+0

Gracias Jay - Descubrí el origen de mi problema y respondí mi propia pregunta. El problema se debió a un conflicto con una versión instalada de coffeelint (ver detalles a continuación). – AlexEberts

12

También podrían obtener este error, independientemente de la utilización de CoffeeScript o Javascript llano, si ha duplicado sus archivos. Por ejemplo, copiar los archivos de origen en un subdirectorio llamado Copia de seguridad produciría este error, porque Meteor fusiona archivos de subdirectorios.

+0

Gracias, esto resolvió mi día. Tenía un complemento de SublimeText mal configurado que producía el archivo .js cada acción de guardado en .coffee. Por lo tanto, obtuve duplicados los archivos del cliente y del servidor. – Hamal000

+0

Gracias, me ahorró muchísimo tiempo. – jamesscaggs

Cuestiones relacionadas