小猫不会说话

我正在运行mongoose快速启动和我的应用程序不断死于fluffy.speak()与错误TypeError: Object { name: 'fluffy', _id: 509f3377cff8cf6027000002 } has no method 'speak'

我的(稍微修改)来自教程的代码:

 "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); }); 

当你调用db.model ,模型是从你的模式编译的。 正是在这一点上, schema.methods被添加到模型的原型。 因此, 您创build模型之前,您需要在模式上定义任何方法。

 // 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.