Bcrypt не перемешивает - PullRequest
       2

Bcrypt не перемешивает

0 голосов
/ 19 октября 2018

Я пытаюсь изучить некоторые файлы Express.js, теперь у меня есть форма, отправленная из внешнего интерфейса React на мой сервер Express, и я вставляю эти данные в схему MongoDB.Следуя некоторым онлайн-учебникам, я попытался хэшировать вставленный пин-код (это не система, которая когда-либо доходила до производства btw) с использованием bcrypt, но данные всегда сохраняются просто, шифрование не производится, с помощью журнала консоли я также вижу, что пин-кодкод не хэшируется

Мой код для хеширования находится в моей модели mongoDB, вот модель

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const Schema = mongoose.Schema;

// Creates the needed schema
let userSchema = new Schema({
  name: String,
  created_at: Date,
  updated_at: Date,
  balance: Number,
  address: String,
  ssn: Number,
  bankNumber: Number,
  cards: [
    {
      formType: String, // Visa eller Mastercard
      cardNumber: Number,
      cvc: Number,
      expirationDate: Date,
      pin: Number,
      status: Boolean,
    }
  ],
  whitdrawal: [
    {
      amount: Number,
      date: Date, 
      reason: String
    }
  ]
});
// Inserts
userSchema.pre('save', function(next) {
  const currentDate = new Date();
  // 10 defines salt rounds
  let pin = this.cards[0].pin
  bcrypt.hash(pin, 10, function(err,hash){
    if(err){
      return next(err); 
    }
    pin = hash; 
  })
  this.updated_at = currentDate;
  this.date = currentDate;
  this.pin = pin; 
  console.log("Pin is " + pin)
  if (!this.created_at) this.created_at = currentDate;
  next();
});

// Creates model for schema
const AtmUser = mongoose.model('AtmUser', userSchema);

// Export so it is available for the rest of the application
module.exports = AtmUser;

Он просто отлично сохраняет данные в схему, просто не шифрует пин-код.Установка даты с сервера в userSchema.pre работает.

Я был бы рад опубликовать любой дополнительный код.

1 Ответ

0 голосов
/ 19 октября 2018

Проблема заключается в том, что bcrypt.hash(..., function(err, hash) { ... }) вызывает обратно предоставленный обратный вызов асинхронно

, следовательно,

this.updated_at = currentDate;
this.date = currentDate;
this.pin = pin; 
console.log("Pin is " + pin)
// etc

будет выполняться раньше

pin = hash; 

имеет шанс на запуск.

Существует три варианта

Чтобы правильно использовать обратные вызовы, поместите ВСЕ код, который опирается на hash внутри обратного вызова

userSchema.pre('save', function(next) {
    const currentDate = new Date();
    // 10 defines salt rounds
    let pin = this.cards[0].pin;
    bcrypt.hash(pin, 10, (err, pin) => {
        if (!err) {
            this.updated_at = currentDate;
            this.date = currentDate;
            this.pin = pin; 
            console.log("Pin is " + pin)
            if (!this.created_at) this.created_at = currentDate;
        }
        next(err);
    })
});

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

userSchema.pre('save', function(next) {
    const currentDate = new Date();
    // 10 defines salt rounds
    let pin = this.cards[0].pin;
    let _this = this; // save _this for the callback
    bcrypt.hash(pin, 10, function(err, pin) {
        if (!err) {
            _this.updated_at = currentDate;
            _this.date = currentDate;
            _this.pin = pin; 
            console.log("Pin is " + pin)
            if (!_this.created_at) _this.created_at = currentDate;
        }
        next(err);
    })
});

или, используя Promises

userSchema.pre('save', function(next) {
    const currentDate = new Date();
    // 10 defines salt rounds
    let pin = this.cards[0].pin
    bcrypt.hash(pin, 10).then((pin) => {
        this.updated_at = currentDate;
        this.date = currentDate;
        this.pin = pin; 
        console.log("Pin is " + pin)
        if (!this.created_at) this.created_at = currentDate;
        next();
    }).catch((err) => {
        next(err); 
    })
});

и, наконец, использование async / await

userSchema.pre('save', async function(next) {
    const currentDate = new Date();
    // 10 defines salt rounds
    let pin = this.cards[0].pin
    try {
        pin = await bcrypt.hash(pin, 10);
    } catch(err) {
        return next(err); 
    }
    this.updated_at = currentDate;
    this.date = currentDate;
    this.pin = pin; 
    console.log("Pin is " + pin)
    if (!this.created_at) this.created_at = currentDate;
    next();
});

Существует четвертый вариант, но никогда не будет веской причины для .hash синхронно

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