我们如何使代码等待在node.js中执行下一条语句

时间:2018-09-04 10:43:01

标签: node.js async-await bcrypt

我有下面提到的node.js代码:

    router.post("/addData", async (req, res)=>{
      const password = req.body.password;
      console.log("before.password: ", password);
      await bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(password, salt, (err, hash) => {
          if (err) {
            console.log("bcrypt error: ", err);
          }
          console.log("hash passw: ", hash);
          password = hash;
        });
      });
      console.log("after.password: ", password);
});

实际输出为:

before.password: passw 
after.password: passw 
hash passw:  $2a$10$TWiXiJQK2abV1T2fvH.nIuqCYKNrMDYaz2PHpATswIVDPYsMw/QsG

我需要预期的输出,如下所示:

before.password: passw 
hash passw:  $2a$10$TWiXiJQK2abV1T2fvH.nIuqCYKNrMDYaz2PHpATswIVDPYsMw/QsG 
after.password: $2a$10$TWiXiJQK2abV1T2fvH.nIuqCYKNrMDYaz2PHpATswIVDPYsMw/QsG

当从bcrypt块中打印密码时,我们得到的普通密码没有被散列,我知道bcrypt可以正常工作并且密码被成功散列,但是我们无法从bcrypt块中获得散列的密码。

对于同一问题,请帮助我,我认为我有时错位了代码。预先感谢。

1 个答案:

答案 0 :(得分:2)

您正在使用两种方法来处理异步代码。当你做

bcrypt.genSalt(10, (err, salt) => { 
  // callback code here
})

您正在使用回调。回调是genSalt函数完成时执行的函数。因此,您要告诉程序:“当genSalt完成运行此代码后”

处理异步代码的另一种方法是将诺言与异步/等待结合使用。所以基本上你说:“等一下,然后给我返回值”

const hash = await bcrypt.genSalt(10) // waiting for promise, no callback.

在您的代码中,您同时使用两个版本。

还要注意,bcrypt也具有genSaltSynchashSync方法。因此,您可以执行以下操作:

router.post("/addData", (req, res)=>{
      const password = req.body.password;
      console.log("before.password: ", password);
      const salt = bcrypt.genSaltSync(10);
      const hash = brypt.hashSync(password,salt)
      console.log("after.password: ", hash);
});

在此示例中,请注意处理程序没有async关键字。由于我们使用的是同步方法。