Nano Hash - криптовалюты, майнинг, программирование

Доступ к переменной пароля пользователя с использованием этого экземпляра внутри другой функции

Я пытаюсь аутентифицировать пользователя, но я получаю эту ошибку в почтальоне

{
"error": "data and hash arguments required"
}

Моя пользовательская модель выглядит так:

const mongoose = require('mongoose')
const bcrypt = require('bcrypt')
const SALT_WORK_FACTOR = 10
const Schema = mongoose.Schema

const UserSchema = new Schema({
  username: { type: String, required: true, index: { unique: true } },
  password: { type: String, required: true }
})
UserSchema.pre('save', function (next) {
  let user = this

  // only hash the password if it has been modified(or is new)
  if (!user.isModified('password')) return next()

  // generate a salt
  bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => {
    if (err) return next()

    // hash the password along with our new salt
    bcrypt.hash(user.password, salt, (err, hash) => {
      if (err) return next(err)
      // override the cleartext password with the hashed one
      user.password = hash
      next()
    })
  })
})
UserSchema.methods.comparePassword = (candidatePassword, callback) => {
  console.log('Password', this.password)// undefined
  bcrypt.compare(candidatePassword, this.password, (err, isMatch) => {
    callback(err, isMatch)
  })
}
module.exports = mongoose.model('userData', UserSchema, 'userData')

Я понял, что this.password, переданный в функцию сравнения bcrypt, разрешается как неопределенное. Как я могу получить доступ к переменной пароля, определенной внутри экземпляра UserSchema выше?


Ответы:


1

По-видимому, в javascript this не присваивается значение до тех пор, пока объект не вызовет функцию, тем самым привязывая this к владельцу метода (вызывающему объекту). В приведенном выше вопросе я использую стрелочные функции es6, чья this привязывается к непосредственной окружающей области (лексической области), поэтому не удалось найти свойство password, которое определено в UserSchema и не привязано к области действия this в функции стрелки.
Пример:

var Utils = {
  printName: function(somename) {
    console.log(somename)
  }
}

var person = {
  firstName: "Gregory",
  lastNames: ["Baltimore", "Barry", "Derrick", "Evanson"],
  fullName: function() {
    this.lastNames.forEach(lastname => {
     //this points to person object
      Utils.printName(this.firstName + " " + lastname) //output Gregory Baltimore Gregory Barry Gregory Derrick Gregory Evanson
    })
  }
}

person.fullName()

Примечание this внутри стрелочной функции es6 указывает на объект person, который является его статической областью (лексической). Давайте посмотрим на тот же фрагмент кода с точки зрения es5.

 var Utils = {
      printName: function(somename) {
        console.log(somename)
      }
    }

    var person = {
      firstName: "Gregory",
      lastNames: ["Baltimore", "Barry", "Derrick", "Evanson"],
      fullName: function() {
        this.lastNames.forEach(function(lastname) {
    //this points to global object
          Utils.printName(this.firstName + " " + lastname)  //output undefined Baltimore undefined Barry undefined Derrick undefined Evanson 
        })
      }
    }

    person.fullName()

Вы заметите, что имя печатается как неопределенное. Это связано с тем, что в es5 this выходит за рамки и, таким образом, по умолчанию (причуда Javascript) привязывается к глобальному объекту. В браузере этот глобальный объект является окном, в Nodejs глобальный объект среда Nodejs (среда выполнения), если она не определена пользователем (например, как при экспорте модуля). Чтобы решить мой вопрос, я по умолчанию использовал функцию es5, поскольку свойство пароля привязано к глобальному объекту, который я определил как UserSchema. Таким образом свойство пароля было правильно разрешено

 UserSchema.methods.comparePassword = function (candidatePassword, callback) {
  //Now this is bound to the UserSchema object
  bcrypt.compare(candidatePassword, this.password, (err, isMatch) => {
    callback(err, isMatch)
  })
}

Подробнее об этом можно узнать здесь Понять «это» в JavaScript С помощью Ясность и мастерство

и здесь тоже Стрелочные функции и ключевое слово this

18.06.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..