簡體   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