Mongoose Schema实例方法调用报错:TypeError: Nodejs.getName is not a function
解决Mongoose实例方法调用报错:TypeError: Nodejs.getName is not a function
嘿,这个问题我之前也踩过坑!核心原因是你添加实例方法的时机太晚了——Mongoose要求你必须在创建模型(mongoose.model())之前,把实例方法绑定到Schema上,不然模型生成后,新添加的方法不会被同步到模型实例里。
错误原因拆解
你现在的代码顺序是:
- 创建
bookSchema - 用
bookSchema创建bookModel - 给
bookSchema.methods添加getName方法 - 创建模型实例并调用方法
但Mongoose在执行mongoose.model()的时候,会一次性把当时Schema上的所有配置(包括实例方法、静态方法、中间件等)都固化到生成的模型里。后续再给Schema加方法,已经和之前创建的模型没关系了,所以你的Nodejs实例自然找不到getName方法。
修正后的代码
只需要把添加实例方法的步骤移到创建模型之前就行,另外还要注意你代码里的变量名大小写错误(Authorname和AuthorName):
const bookSchema = new Schema( { name : String , Author : String } ); // 第一步:先给Schema绑定实例方法 bookSchema.methods.getName = function(){ return ('the name of book is ' + this.name + ' the name of book author is ' + this.Author); } // 第二步:再用配置好的Schema创建模型 const Model = mongoose.model; const bookModel = Model('book',bookSchema); const Nodejs = new bookModel({name:'Node.js Book' , Author:'Me '}); const Authorname = Nodejs.getName(); console.log(Authorname); // 这里变量名要和前面定义的一致,原代码的AuthorName是笔误
额外提示
如果之后需要给模型添加新的实例方法,你得重新创建模型,或者直接在模型的prototype上添加(不过更推荐前者,符合Mongoose的规范):
// 不推荐但可行的方式:给已生成的模型原型加方法 bookModel.prototype.getAuthor = function() { return this.Author; }
内容的提问来源于stack exchange,提问作者user16945874
相关产品推荐
相关产品推荐

