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