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

时间:2018-06-29 07:16:53

标签: 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");

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

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这很好...

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

答案 2 :(得分:0)

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

from module_two import Module_Two

那样,您就不需要任何类型的 synchronization (一切都是回调,即使调用了promises,wait,async等,也是如此……因此,异步世界中的同步代码需要每一个回调以启动下一个异步作业,这在像这样的一些简单情况下可能很烦人。)

答案 3 :(得分:0)

以下方法适用于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一起使用

答案 4 :(得分:0)

这应该有效:

//lets just say this controller requires a crypto key
exports.resetPasswordRequest = async (req, res, next) => {
  const email = req.body.email;
  const user = User.findByEmail(email);
  const token = await utilities.cryptoAsync(32);
  res.json({ message: "Test" });
};
//we can use this async method to return a promise containing the key
const cryptoAsync = async size => {
  const token = await new Promise((res, rej) => {
    crypto.randomBytes(size, (err, buffer) => {
      if (err) {
        rej(err);
      }
      res(buffer.toString("hex"));
    });
  });
  return token;
};