Результат не определен JS. Я не могу получить доступ к этому атрибуту - PullRequest
0 голосов
/ 22 марта 2020

Я не могу получить результат avatar.path, как я могу это сделать? Если я помещаю this.nome, я получаю нормально, но я не могу получить результат avatar.path.

Если я пишу this.avatar.name = value, то выдается следующая ошибка:

(узел: 6652) UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'path' из неопределенного

Мне нужно получить avatar.path, потому что я буду использовать для обратного URL

const UserSchema = mongoose.Schema(
  {
    nome: {
      type: String,
      require: true
    },
    email: {`enter code here`
      type: String,
      unique: true,
      required: true,
      lowercase: true
    },
    password: {
      type: String,
      required: true
    },
    passwordresetoken: {
      type: String,
      select: false
    },
    passwordresetexpires: {
      type: Date,
      select: false
    },
    usuario_validado: {
      type: Boolean
    },
    cpf: {
      type: String,
      required: true
    },
    user_cuidador: {
      type: Boolean
    },
    avatar: [
      {
        nome: {
          type: String
        },
        path: { type: String, required: true }
      }
    ],
    createdAt: {
      type: Date,
      default: Date.now
    }
  },
  {
    toObject: {
      getters: true,
      setter: true,
      virtuals: true
    },
    toJSON: {
      getters: true,
      setter: true,
      virtuals: true
    }
  }
);


UserSchema.virtual("url").get(function() {
  console.log(this.nome); // I receive right the name
  console.log(this.avatar); // I receive undefined

  // I need to return avatar.path 
  return `http://localhost:300/files/${this.nome}`; // I can receive all the names right. But, I need avatar.path
});

1 Ответ

0 голосов
/ 22 марта 2020

avatar - это массив

{
  nome: {
    type: String
  },
  path: { type: String, required: true }
}

, как определено

avatar: [
  {
    nome: {
      type: String
    },
    path: { type: String, required: true }
  }
],

Также может быть undefined.

Вы рассматриваете это как объект здесь: this.avatar.name = value.

Если предполагается, что это всегда будет массив 1, то преобразуйте его в объект:

avatar: {
    nome: {
      type: String
    },
    path: { type: String, required: true }
  },

и удостоверьтесь, что в вашем виртуальном аккаунте установлена ​​нулевая / неопределенная регистрация. Если вам нужно, чтобы аватар присутствовал всегда, то, если память служит, вы можете сделать аватар схемой и потребовать его.

const AvatarSchema = mongoose.Schema({
  nome: {
    type: String
  },
  path: { type: String, required: true }
})

, а затем внутри вашего UserSchema, вы будете ссылаться на него:

avatar: { type: AvatarSchema, required: true }

В противном случае вам нужно будет обнулить / неопределить проверку:

UserSchema.virtual("url").get(function() {
  console.log(this.nome); // I receive right the name
  console.log(this.avatar); // I receive undefined

  // if avatar is an array then I guess you just want the first one?
  let avatarPath;
  if(this.avatar && this.avatar.length) {
    avatarPath = this.avatar[0].path
  } 
  // ... 

  return avatarPath ? avatarPath : `http://localhost:300/files/${this.nome}`; 
});

Если вы сохраните свою схему как есть и попытаетесь установить путь к аватару, вы сделать что-то вроде этого:

this.avatar = this.avatar || []
this.avatar.push({name: value})
// but it will fail to validate because path is required.

Проверьте документы для понедельник goose поддокатов

Редактировать:

Я забыл упомянуть, что вы в ваш вопрос, вы ссылаетесь на this.avatar.name, но ваша схема ссылается на nome, а не name

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