在array.map javascript中使用回调函数

时间:2017-11-03 05:31:38

标签: javascript ecmascript-6

我正在尝试为数组中的每个用户加密密码。

router.post("/insertuser", (req, res) => {

  var promises = users.map((item) => {

    bcrypt.genSalt(10)
      .then((salt) => {
        return item
      })    
  })

  Promise.all(promises)
    .then((results) => {
      console.log(results)
      res.json({
        "data": results
      })
    })    
})//end route

但我得到的结果= [未定义,未定义]。

如何从 bcrypt.genSalt(10)返回数组元素。然后

请帮助我,因为我是ES6的新手

编辑:我的用户用户数组是这样的:

[{" username":" admin"," admin":true}     ]

2 个答案:

答案 0 :(得分:1)

只需从bcrypt.genSalt返回承诺。

router.post("/insertuser", (req, res) => {

  var promises = users.map((item) => {

    return bcrypt.genSalt(10)
      .then((salt) => {
        return item
      })    
  })

  Promise.all(promises)
    .then((results) => {
      console.log(results)
      res.json({
        "data": results
      })
    })    
})//end route

答案 1 :(得分:0)

在任何承诺之后添加.then()时,它将直接得到解决。在您的代码中,users.map()将同步运行,并且promises将是未定义的。 以下是您可以使用的代码:

router.post("/insertuser", (req, res) => {
    var promises = users.map((item) => {
      return bcrypt.genSalt(10);
    })

    Promise.all(promises)
      .then((results) => {
        console.log(results)
    });  
})//

还要注意salt用于生成哈希。你只生盐。要生成密码哈希,还要添加bcrypt.hash(password,salt)。这是代码:

var promises = users.map((item) => {
  return bcrypt.genSalt(10);
})

Promise.all(promises)
  .then((results) => {
    promises = results.map((item, index) => {
      return bcrypt.hash(users[index], item);
    });
    return Promise.all(promises);
  })
  .then(result => {
    console.log(result);
  })
  .catch(err => {
    console.log(err);
  });