Express.js mongoose: TypeError Невозможно установить свойство undefined - PullRequest
0 голосов
/ 27 февраля 2019

Я создал 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: Невозможно установить свойство "name" из неопределенного

Как могло this бытьundefined?

Если я изменю метод, передавая объект, я мог бы заставить его работать так, как я хочу, но он выглядит грязным и неправильным, поскольку все, что я хочу сделать, - это изменить свойство объекта с помощью его метода..

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

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы используете синтаксис Arrow function, ключевое слово this со стрелкой имеет некоторые проблемы.

Исправление: используйте синтаксис старой школы

UserSchema.methods.setName = function(name) {
  this.name = name + '123'
}
0 голосов
/ 27 февраля 2019

Функции стрелок не привязывают свои this.Они используют лексический this.Функции стрелок лексически связывают свой контекст, поэтому this фактически ссылается на исходный контекст.Это называется лексическим ограничением.И что означает лексическая область видимости:

Лексическая область видимости (иногда известная как статическая область видимости) - это соглашение, используемое во многих языках программирования, которое устанавливает область действия (диапазон функциональности) переменной так, чтобы она могла быть тольковызывается (ссылается) из блока кода, в котором он определен.

Более подробные объяснения этой проблемы, например, MDN .

ВВ итоге получается, что он будет искать this во всех родительских контекстах, пока не найдет его, а в вашем случае, потому что в модуле нигде нет определения this, возвращается undefined.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...