Express.js + Mongoose报错:TypeError: 无法设置undefined的属性'name'
解决Mongoose实例方法中
this为undefined的问题 嘿,这个问题其实是箭头函数的this绑定特性在搞鬼!我来给你拆解清楚:
为什么会报错?
你在定义setName方法时用了箭头函数,但箭头函数不会生成自己的this上下文,它会“继承”外层作用域的this。在Mongoose的Schema方法定义场景下,这个外层作用域的this在Node.js模块的严格模式下就是undefined,自然没法给this.name赋值,所以才会抛出Cannot set property "name" of undefined的错误。
正确的写法(优雅符合规范)
只要把箭头函数换成普通函数表达式就行,Mongoose会自动把方法里的this绑定到当前的User模型实例上:
import mongoose, { Schema } from 'mongoose' const UserSchema = new Schema({ name: String }) // 用普通函数替代箭头函数 UserSchema.methods.setName = function(name) { this.name = name + '123' } export default mongoose.model('User', UserSchema)
控制器里的调用逻辑完全不用改,保持原来的面向对象写法就好:
import User from './User' export const signup = (request, response) => { const name = 'Ignas' const UserModel = new User() UserModel.setName(name) // 接下来可以正常保存实例到数据库 // UserModel.save().then(doc => response.send(doc)).catch(err => console.error(err)) }
这样调用setName时,this就精准指向了UserModel这个实例,完美符合通过对象方法修改自身属性的规范。
关于你之前的临时解决方案
你之前改成让方法接收实例参数的写法虽然能跑,但确实不够优雅——实例方法的核心就是能通过this访问自身,没必要多传一个参数。上面的普通函数写法才是Mongoose推荐的正确姿势哦。
内容的提问来源于stack exchange,提问作者Ignas Damunskis
相关产品推荐
相关产品推荐

