как мы делаем код для ожидания выполнения следующего оператора в node.js - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть код 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 голосов
/ 04 сентября 2018

Вы используете два метода для работы с асинхронным кодом. Когда вы делаете

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

вы используете обратный вызов. Обратный вызов - это функция, которая выполняется после завершения функции genSalt. Итак, вы говорите программе: "когда genSalt завершит выполнение этого кода"

Другой способ обработки асинхронного кода - использование обещаний с async / await. Итак, в основном вы говорите: «подождите это и верните мне значение»

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

В вашем коде вы делаете обе версии.

Также обратите внимание, что bcrypt также имеет метод genSaltSync и hashSync. Таким образом, вы можете сделать что-то вроде:

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);
});

Обратите внимание, что в этом примере обработчик не имеет асинхронного ключевого слова. Поскольку мы используем синхронные методы.

...