【问题标题】:Express.js mongoose: TypeError Cannot set property of undefinedExpress.js mongoose:TypeError 无法设置未定义的属性
【发布时间】:2019-02-27 09:44:15
【问题描述】:

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

【问题讨论】:

  • 我认为这是一个上下文问题。尝试将实例绑定到函数。 UserSchema.methods.setName = function (name) { this.name = name + '123' }.bind(UserSchema)

标签: javascript node.js express mongoose


【解决方案1】:

箭头函数不绑定自己的this。他们使用词法 this。箭头函数在词法上绑定了它们的上下文,所以this 实际上是指原始上下文。这称为词法作用域。以及词法作用域意味着什么:

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

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

最后,它会在所有父级的上下文中寻找this,直到找到它,在你的情况下,因为在模块中没有任何地方this的定义,返回@ 987654327@。

【讨论】:

    【解决方案2】:

    你正在使用Arrow function 语法,this 关键字与箭头函数有些东西乱七八糟。

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 2021-11-27
      • 2018-09-02
      • 1970-01-01
      • 2022-10-30
      • 2023-02-10
      • 2015-12-07
      • 2013-05-28
      相关资源
      最近更新 更多