Javascript bcrypt哈希数组中的所有密码

Javascript bcrypt哈希数组中的所有密码,javascript,async-await,Javascript,Async Await,我有一个包含“用户”的对象数组,每个对象都有用户名、名称和密码属性。我想散列每个用户的密码,创建一个具有相同属性的用户对象,但忽略散列的密码,然后在保存之前使用map()返回密码,然后使用Promise.all()完成它 const initialUsersArray=[ { 用户名:“user1”, 名称:“用户McUser”, 密码:“abcd” }, { 用户名:“user2”, 名称:“用户Usersson”, 密码:“1234” }, const SALT\u WORK\u FACT

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

const initialUsersArray=[
{
用户名:“user1”,
名称:“用户McUser”,
密码:“abcd”
},
{
用户名:“user2”,
名称:“用户Usersson”,
密码:“1234”
},
const SALT\u WORK\u FACTOR=10;
const hashedUsers=initialUsersArray.map(异步(用户)=>{
const hashedPassword=await bcrypt.hash(user.password,SALT\u WORK\u FACTOR);
返回新用户({
用户名:user.username,
name:user.name,
哈希密码
});
});
const promiseArray=hashedUsers.map(user=>user.save());
等待承诺。全部(承诺人);
问题在于,在尝试保存()每个用户之前,它不会等待承诺得到解决。 如果我使用console.log hashedUsers,我会得到一个
Promise{},

我遗漏了一些关于承诺在map()中如何起作用的信息, 如果我只对一个用户使用上面的功能,就像这样

const hashedPassword=wait bcrypt.hash(密码,SALT\u WORK\u系数);
const user=新用户({
用户名:用户名,
姓名:姓名,,
哈希密码,
});
等待用户。保存()

您可以尝试下面的代码,它工作正常,我刚刚测试过

代码的问题在于,您没有等待
hashedUsers
解决,
hashedUsers
有未决的承诺,您应该
wait
,您可以先执行
wait 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();

我已经发布了一个新的答案,希望能解决你的问题。如果不能,请告诉我。