You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose Schema实例方法调用报错:TypeError: Nodejs.getName is not a function

解决Mongoose实例方法调用报错:TypeError: Nodejs.getName is not a function

嘿,这个问题我之前也踩过坑!核心原因是你添加实例方法的时机太晚了——Mongoose要求你必须在创建模型(mongoose.model())之前,把实例方法绑定到Schema上,不然模型生成后,新添加的方法不会被同步到模型实例里。

错误原因拆解

你现在的代码顺序是:

  1. 创建bookSchema
  2. 用bookSchema创建bookModel
  3. 给bookSchema.methods添加getName方法
  4. 创建模型实例并调用方法

但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:09:07