2012-09-20 1 views
7

Quelqu'un peut-il me dire pourquoi le code ci-dessous renvoie l'erreur suivante? :Pourquoi Meteor se plaint-il qu'une méthode d'insertion pour une collection est déjà définie?

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

Je suis nouveau à Meteor et coffeescript, donc je peux être négliger quelque chose de simple.

Voici mon port de l'exemple leaderboard à 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 

La trace complète de la pile est la suivante:

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

J'exécute la version Meteor 0.4.0 (de 8f4045c1b9)

Merci d'avance pour votre aide!

+2

Est-il possible de publier votre projet complet quelque part? Je pense que votre problème est de définir la collection deux fois .. peut-être que vous n'avez pas supprimé le fichier .js d'origine? –

Répondre

0

Cela semble être un problème de configuration avec coffeelint (installé globalement avec npm).

À l'origine, j'ai installé coffeelint pour vérifier que mon code café était correct et qu'il n'y avait pas d'erreur.

J'ai installé coffeelint selon les instructions avec:

sudo npm install -g coffeelint

coffeelint a bien fonctionné lorsqu'il est exécuté autonome contre les fichiers .coffee. Cependant, lors de l'exécution de n'importe quel projet Meteor avec le paquet coffeescript ajouté, j'ai eu l'erreur ci-dessus. Sur un coup de tête, j'ai pensé que l'erreur pouvait être due à un conflit avec mon installation de noeud existante.

j'ai décidé de désinstaller coffeelint d'abord avec:

sudo npm uninstall -g coffeelint

puis supprimé le fichier leaderboard.js précédemment généré météore. Après le redémarrage de météore, l'exemple coffeescript ci-dessus a fonctionné comme prévu sans erreur.

+0

", puis supprimé le fichier leaderboard.js précédemment généré par météore" - comme d'autres l'ont dit, cette erreur est causée par Meteor instanciant deux fois la même collection. –

0

essayer de déplacer (par exemple la copie et la suppression de l'original)

Players = new Meteor.Collection("players")

une fois ci-dessous if Meteor.is_client et une autre fois ci-dessous if Meteor.is_server

Je ne sais pas exactement pourquoi, comme je suis nouveau à Meteor aussi, mais cela a fonctionné pour moi, je suppose que le côté serveur a besoin de sa propre référence, ainsi que le client, bien que déclarer en dehors de la portée devrait faire la même chose (peut-être un bug, rappelez-vous qu'ils sont toujours à 0.5. 0 aperçu, ce qui rend m Je pense que vous pourriez vouloir mettre à jour et essayer de nouveaux paquets intelligents qui sont avec la nouvelle version, on dirait que vous utilisez 0.4), mais quand les fichiers de mon serveur ne reconnaîtraient rien, j'ai défini le répertoire racine de météore (qui pousse ces fichiers sur le client et le serveur), j'ai défini la référence du serveur et j'ai eu la même erreur, et jusqu'à ce que je déplace la déclaration publique de la référence pour donner au serveur et au client chacun leur propre copie, rien n'a fonctionné .

Espérons qui aide ...

+0

Merci Jay - J'ai découvert la source de mon problème et répondu à ma propre question. Le problème était dû à un conflit avec une version installée de coffeelint (voir les détails ci-dessous). – AlexEberts

12

Vous obtenez également cette erreur, quelle que soit l'utilisation coffeescript ou javascript simple, si vous dupliquées vos fichiers. Par exemple, la copie de vos fichiers sources dans un sous-répertoire nommé Backup produira cette erreur, car Meteor fusionne les fichiers des sous-répertoires.

+0

Merci, cela a résolu ma journée. J'ai eu un plugin SublimeText mal configuré qui a produit le fichier .js chaque action de sauvegarde sur le .coffee. Par conséquent, j'ai dupliqué les fichiers client et serveur. – Hamal000

+0

Merci, m'a sauvé des tonnes de temps. – jamesscaggs

Questions connexes