2012-11-11 4 views
10

Je suis en cours d'exécution à travers le mongoose quickstart et mon application ne cesse de mourir sur fluffy.speak() avec l'erreur TypeError: Object { name: 'fluffy', _id: 509f3377cff8cf6027000002 } has no method 'speak'chaton ne peut pas parler

Code Mon (légèrement modifié) du tutoriel:

"use strict"; 

var mongoose = require('mongoose') 
    , db = mongoose.createConnection('localhost', 'test'); 

db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    var kittySchema = new mongoose.Schema({ 
     name: String 
    }); 
    var Kitten = db.model('Kitten', kittySchema); 
    var silence = new Kitten({name: 'Silence'}); 
    console.log(silence.name); 
    kittySchema.methods.speak = function() { 
     var greeting = this.name ? "Meow name is" + this.name : "I don't have a name"; 
     console.log(greeting); 
    }; 

    var fluffy = new Kitten({name: 'fluffy'}); 

    fluffy.speak(); 

    fluffy.save(function(err) { 
     console.log('meow'); 
    }); 

    function logResult(err, result) { 
     console.log(result); 
    } 

    Kitten.find(logResult); 
    Kitten.find({name: /fluff/i }, logResult); 
}); 
+2

Lol, le titre crie juste "OFF SUJET!" : P – Doorknob

+0

Oui je peux! Je parle en ce moment! – bjb568

Répondre

9

Lorsque vous appelez db.model, le modèle est compilé à partir de votre schéma. C'est à ce moment-là que schema.methods sont ajoutés au prototype du modèle. Vous devez donc définir toutes les méthodes sur le schéma avant de créer un modèle à partir de.

// ensure this method is defined before... 
kittySchema.methods.speak = function() { 
    var greeting = this.name ? "Meow name is" + this.name : "I don't have a name"; 
    console.log(greeting); 
} 

// ... this line. 
var Kitten = db.model('Kitten', kittySchema); 

// methods added to the schema *afterwards* will not be added to the model's prototype 
kittySchema.methods.bark = function() { 
    console.log("Woof Woof"); 
}; 

(new Kitten()).bark(); // Error! Kittens don't bark.