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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:07:15