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

时间:2019-02-27 09:44:15

标签: javascript node.js express mongoose

我创建了一个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)

2 个答案:

答案 0 :(得分:1)

箭头功能不绑定自己的this。他们使用 lexical this。箭头函数按词法绑定它们的上下文,因此this实际上是指原始上下文。这称为词汇作用域。词汇作用域意味着什么:

  

词汇范围(有时也称为静态范围)是一种惯例   与许多设置范围(范围   功能),以便只能调用它   (引用)来自定义它的代码块。

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

最后,发生的事情是它将在所有父级的上下文中寻找this直到找到为止,在您的情况下,因为在模块中没有this的定义在任何地方返回undefined

答案 1 :(得分:0)

您使用Arrow function语法,带有箭头功能的this关键字有些混乱。

修补程序:使用旧式函数语法

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