繁体   English   中英

Express.js猫鼬:TypeError无法设置未定义的属性

[英]Express.js mongoose: TypeError Cannot set property of undefined

我创建了一个UserSchema并添加了一个尝试设置其属性name

import mongoose, { Schema } from 'mongoose'

const UserSchema = new Schema({
  name: String
})

UserSchema.methods.setName = (name) => {
  this.name = name + '123'
}

exports default mongoose.model('User', UserSchema)

我导入了对象,并从我创建的控制器中调用了该方法:

import User from './User'

exports.signup = (request, response) => {
  const name = 'Ignas'

  const UserModel = new User
  UserModel.setName(name)

  ...
}

由于某种原因,它引发了一个错误:

TypeError:无法设置未定义的属性“名称”

怎么能this是不确定的?

如果我修改了一个传递对象的方法,则可以使它按我的意愿工作,但是它看起来很脏而且不正确,因为我要做的就是通过对象的方法来更改对象的属性。

// modified method of Schema
UserSchema.methods.setName = (User, name) => {
  User.name = name + '123'
}

// modified call from the controller
UserModel.setName(name)

箭头函数不绑定它自己的this 他们使用词汇 this 箭头功能词汇结合其上下文所以this实际上指的是起始上下文。 这称为词汇作用域。 词汇作用域的含义是:

词法作用域(有时称为静态作用域)是一种与许多编程语言一起使用的约定,用于设置变量的范围(功能范围),以便只能在定义该变量的代码块内调用(引用)该变量。

例如,您在MDN中有关于此问题的更多说明。

最后,什么情况是,它会寻找this在所有父母的情况下,直到它找到它,你的情况,因为在模块中没有的定义this在任何地方,返回undefined

您正在使用Arrow function语法, this带有arrow函数的关键字有些混乱。

修补程序:使用旧的学校函数语法

UserSchema.methods.setName = function(name) {
  this.name = name + '123'
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM