【问题标题】:bcrypt hash all password in arraybcrypt 散列数组中的所有密码
【发布时间】:2021-04-02 23:58:39
【问题描述】:

我有一个带有“用户”的对象数组,每个对象都有一个用户名、名称和密码属性。我想对每个用户的密码进行哈希处理,创建一个具有相同属性但省略哈希密码的用户对象,然后在保存之前使用 map() 返回它,然后使用 Promise.all() 完成它

const initialUsersArray = [
  {
    username: 'user1',
    name: 'User McUser',
    password: 'abcd'
  },
  {
    username: 'user2',
    name: 'User Usersson',
    password: '1234'
  },
const SALT_WORK_FACTOR = 10;

const hashedUsers= initialUsersArray.map(async (user) => {
    const hashedPassword = await bcrypt.hash(user.password, SALT_WORK_FACTOR);
    return new User({
      username: user.username,
      name: user.name,
      hashedPassword 
    });
  });
  const promiseArray = hashedUsers.map(user => user.save());
  await Promise.all(promiseArray);

问题是在尝试 save() 每个用户之前它不会等待承诺解决。 如果我 console.log hashedUsers 我得到一个数组 Promise { <pending> },

我遗漏了一些关于 Promises 在 map() 中如何工作的内容, 如果我只将它用于单个用户,上面的工作就很好,就像这样

const hashedPassword = await bcrypt.hash(password, SALT_WORK_FACTOR);
const user = new User({
  username: username,
  name: name,
  hashedPassword,
});
await user.save()

【问题讨论】:

  • 我发布了一个新答案,希望能解决您的问题。如果没有,请告诉我。

标签: javascript async-await


【解决方案1】:

您可以尝试下面的代码,它是否按预期工作,我刚刚测试过!

您的代码的问题在于您没有等待hashedUsers 解决,hashedUsers 有待处理的承诺,您应该await,您可以先执行await Promise.all(hashedUsers),然后等待.save(),但是您可以按照以下代码中的说明一次性完成。

const userSchema = new mongoose.Schema({
  user: String,
  name: String,
  hashedPassword: String,
});

const User = mongoose.model("User", userSchema);

const initialUsersArray = [
  {
    username: "user1",
    name: "User McUser",
    password: "abcd",
  },
  {
    username: "user2",
    name: "User Usersson",
    password: "1234",
  },
];

const SALT_WORK_FACTOR = 10;

const hashedUsers = initialUsersArray.map(async (user) => {
  const hashedPassword = await bcrypt.hash(user.password, SALT_WORK_FACTOR);
  const userDoc = await new User({
    username: user.username,
    name: user.name,
    hashedPassword,
  }).save();
  return userDoc;
});

const main = async () => {
  const promiseArray = await Promise.all(hashedUsers);
  console.log(promiseArray);
};

main();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2021-06-04
    • 2019-07-17
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多