Как синхронизировать функцию crypto.randomBytes () модуля crypto в узле js? - PullRequest
0 голосов
/ 29 июня 2018
crypto = require('crypto')
async function generateToken(){
  await crypto.randomBytes(256,function(ex, buffer) {
    if (ex) {
      console.log("error generating token");
    }

        var token =  crypto
          .createHash('sha1')
          .update(buffer)
          .digest('hex');

        console.log(token);



  }
)}
console.log("before token");
generateToken();
console.log("after token");

В приведенном выше коде я хотел синхронизировать метод generateToken(). Поэтому я добавил async и await к функции, но я не получаю ожидаемый результат, который составляет

before token 
7f4f27037cd7dd65bd03d7e2fe859e608b9eebe2
after token 

вывод, который я получаю

before token 
after token
7f4f27037cd7dd65bd03d7e2fe859e608b9eebe2

Что я делаю не так в приведенном выше коде?

редактирование: следующий код будет работать, но он не синхронизирован.

crypto = require("crypto");
function generateToken() {
  return new Promise((resolve, reject) => {
    crypto.randomBytes(256, function(ex, buffer) {
      if (ex) {
        reject("error generating token");
      }
      const token = crypto
        .createHash("sha1")
        .update(buffer)
        .digest("hex");
      resolve(token);
    });
  });


  console.log(token);
}

console.log("before token");
generateToken().then((token) => {
  console.log(token);
  console.log("after token");
});

Ответы [ 4 ]

0 голосов
/ 23 апреля 2019

Следующий метод работает с TypeScript "typescript": "^3.4.4"

const randomKey = async (length: Number) => {
  const buffer = await crypto.randomBytes(16);
  return buffer.toString("hex");
};

const getAndLogKey = async () => {
  const randomKey = await randomKey(16);
  console.log(randomKey);
};

должно работать и с JS

0 голосов
/ 29 июня 2018

это работает нормально ...

 crypto = require("crypto");

    function generateToken() {
      return new Promise((resolve, reject) => {
        crypto.randomBytes(256, function(ex, buffer) {
          if (ex) {
            reject();
          }
          const token = crypto
            .createHash("sha1")
            .update(buffer)
            .digest("hex");
          console.log(token);
          resolve();
        });
      });

    }

    async function otherFunction() {
      try {
        console.log("before token");
        await generateToken()
        console.log("after token");
      } catch (e) {
        console.error(e)
      }
    }
    otherFunction();
0 голосов
/ 26 ноября 2018

Если вы не укажете функцию, то используется синхронная версия функции, и она возвращает результирующие байты.

token = crypto.randomBytes(256)

Таким образом, вам не нужна какая-либо синхронизация (все это обратные вызовы, даже когда вызываются обещания, ожидание, асинхронизация, еще много чего ... поэтому синхронный код в асинхронном мире требует каждый предыдущий обратный вызов начать следующую асинхронную работу, которая может раздражать в некоторых простых случаях, таких как этот.)

0 голосов
/ 29 июня 2018
const crypto = require("crypto");
async function generateToken() {
  const buffer = await new Promise((resolve, reject) => {
    crypto.randomBytes(256, function(ex, buffer) {
      if (ex) {
        reject("error generating token");
      }
      resolve(buffer);
    });
  });
  const token = crypto
    .createHash("sha1")
    .update(buffer)
    .digest("hex");

  console.log(token);
  return token;
}

console.log("before token");
generateToken().then(token => {
  console.log("after token", token);
});

Вы также можете вызвать его в другой асинхронной функции

async function otherFunction() {
  try {
    console.log("before token");
    const token = await generateToken();
    console.log("after token", token);
  } catch (e) {
    console.error(e)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...