[英]Express.js and connect-mongo session “TypeError: Cannot read property 'upserted' of undefined”
[英]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.