Как я могу обновить каждый пароль в моей базе данных с помощью хешированной версии bcrypt? - PullRequest
1 голос
/ 17 марта 2020

Итак, как вы можете видеть. Я пытаюсь взять предыдущий пароль в столбце и обновить его хэшированной версией. По какой-то причине сохранение на документе не срабатывает сразу. Поэтому я попытался использовать asyn c await и даже создать собственный asyn c await foreach для ожидания обратного вызова и сохранения. Тем не менее, Mon goose, кажется, ждет, пока все сохранения сохранятся, прежде чем применить сохранение.

Это ошибка, которую я получаю.

UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри asyn c -функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (код отклонения: 505) (узел: 2440)

const User = require("./models/User");
const bcrypt = require("bcryptjs");
const db = require("./config/keys").mongoURI;


async function hashIt(user) {
    console.log(user);
    bcrypt.genSalt(10, (err, salt) => {
        if (err) console.log(err);
        bcrypt.hash(user.Password, salt, async (err, hash) => {
            if (err) throw err;
            user.Password = hash;
            const id = await user.save();
            console.log(id);
        })
    });
}

async function asyncForEach(array, callback) {
    for (let index = 0; index < array.length; index++) {
        await callback(array[index], index, array);
    }
}

async function mySeed() {
    try {
        User.find({}, async (err, users) => {
            if (err) console.log(err);
            asyncForEach(users, async (user) => {
                await hashIt(user);
            })
        });
    } catch (e) {
        console.log(e);
    }
}

async function fullThing(){
    mongoose.connect(db, { useNewUrlParser: true })
    .then(async () => {
        await mySeed();
        console.log("finished successfully");
    })
}

fullThing();```     

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Я ценю ответ. Решением оказалось то, что w = большинство по какой-то причине необходимо было удалить из соединения с БД. После удаления этого. Все стало работать нормально. Обертывание соединения с помощью catch помогло найти ошибку.

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

У меня есть аналогичная подпрограмма, работающая в моей текущей задней интерфейсной системе, и ниже я расскажу, как я адаптировал ваш код к моему; мой работает, поэтому я надеюсь, что ваш будет работать. Я считаю, что проблема в том, что вы не улавливаете потенциальные ошибки, которые случались со мной много в начале, а иногда это все же происходит, когда я устал.

bcrypt.genSalt(10, (err, salt) => {
  if (err) console.log(err);
  bcrypt.hash(user.Password, salt, (err, hash) => {
    if (err) throw err;
    user.Password = hash;
    const id = user
      .save()
      .then(() => {
        console.log("okay");
      })
      .catch(err => console.log(err));

  });
});

Если это не работает, пожалуйста, дайте мне знать, что является ошибкой.

Приложение

Я проверил свой Решение ниже:

const bcrypt = require("bcryptjs");
require("./connection");

//creating user schema
var mongoose = require("mongoose");
var Schema = mongoose.Schema;

UserSchema = new Schema({ name: String, password: String });
var User = mongoose.model("User", UserSchema);

const user = new User({ name: "Jorge Pires", password: "Corona Virus" });

console.log(` Before hashing ${user.password}`);

//---------------------------------------------------------------
//Uncomment here to save the user before hashing, it will change anyway, therefore no need!
// user.save();
// User.create({ name: "Jorge Pires", password: "Corona Virus" });
//--------------------------------------------------------------
bcrypt.genSalt(10, (err, salt) => {
  //generates the salta
  if (err) console.log(err);
  bcrypt.hash(user.password, salt, (err, hash) => {
    //creates the hash
    if (err) throw err;
    user.password = hash; //saves the hash
    const id = user
      .save()
      .then(() => {
        console.log(` after hashing ${user.password}`);
        console.log(` Here goes the user id  ${user.id}`);
      })
      .catch(err => console.log(err));
  });
});

Пример вывода:

Before hashing Corona Virus
we are connected mongoose-tutorial
 after hashing $2a$10$84MqPsiiMGA/KTHKFbytVOD5/su6rXiE7baA2TmsLzPMe.Y45aL9i
 Here goes the user id  5e710a0bd4385c05b0cd827f
...