Javascript bcrypt哈希数组中的所有密码
我有一个包含“用户”的对象数组,每个对象都有用户名、名称和密码属性。我想散列每个用户的密码,创建一个具有相同属性的用户对象,但忽略散列的密码,然后在保存之前使用map()返回密码,然后使用Promise.all()完成它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
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();
我已经发布了一个新的答案,希望能解决你的问题。如果不能,请告诉我。