如何在节点js中同步crypto模块的crypto.randomBytes()函数?

Ani*_* GR 4 node.js async-await

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");
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我想同步generateToken()方法。所以我在函数中添加了asyncandawait,但我没有得到预期的输出

before token 
7f4f27037cd7dd65bd03d7e2fe859e608b9eebe2
after token 
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

before token 
after token
7f4f27037cd7dd65bd03d7e2fe859e608b9eebe2
Run Code Online (Sandbox Code Playgroud)

我在上面的代码中做错了什么?

编辑: 以下代码可以工作,但不同步。

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");
});
Run Code Online (Sandbox Code Playgroud)

ant*_*tud 7

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);
});
Run Code Online (Sandbox Code Playgroud)

您也可以在其他异步函数中调用它

async function otherFunction() {
  try {
    console.log("before token");
    const token = await generateToken();
    console.log("after token", token);
  } catch (e) {
    console.error(e)
  }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lke 7

如果您未指定函数,则使用该函数的同步版本并返回结果字节。

token = crypto.randomBytes(256)
Run Code Online (Sandbox Code Playgroud)

这样你就不需要任何类型的同步(一切都是回调,即使调用 Promise、wait、async 等等......所以异步世界中的同步代码需要每个先前的回调来启动下一个异步作业,这可以在像这样的一些简单情况下会很烦人。)