Mic*_*Jay 2 javascript callback node.js typescript
我已经多次阅读了 Node crypto 模块的 pbkdf2() 函数的文档。我之前问的一个问题没有经过太多思考就崩溃了 - 所以让我这么说:我认为我对回调缺乏理解 - 但我阅读了很多资源试图真正理解它 - YDKJS Async,MDN,“学习 JavaScript” ”奥莱利。
我在回调中的 else 子句中有一个 console.log 语句,该语句正在适当地进行日志记录,因此我确信回调正在执行,尽管我的调试程序(在 VSCode 中)没有停止执行。
我尝试了两种不同的方法,如下面的代码所示:一种是声明一个变量并在 else 子句中将其值更改为衍生密钥.toString('hex'),另一种是返回衍生密钥.toString('十六进制')。两者都不起作用。
我尝试链接 then 子句,但 crypto.pbkdf2 返回 void 并且“属性 'then' 在类型 'void' 上不存在”。
书面方法如下:
private static async hashPassword(password:string, salt:string):Promise<string> {
var hashedPassword;
const iterations = 50000;
const keylen = 64;
const digest = 'sha512';
const possibleReturnedValue = await crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, derivedKey) => {
if (err) {throw err;}
else {
console.log(derivedKey.toString('hex'));
console.log("Hey now");
hashedPassword = derivedKey.toString('hex');
return derivedKey.toString('hex');
}
})
return hashedPassword;
}Run Code Online (Sandbox Code Playgroud)
真正归结为:我不知道如何从回调返回“void”的函数中获取导出的 Key.toString('hex') 值。
小智 5
您的问题是该crypto.pbkdf2函数有点旧,并且不能使用承诺,而是使用回调。因此,为了在现代异步代码中使用此函数,有必要将该函数包装在一个Promise对象中。
关键思想是在回调中调用Promise 构造函数给出的resolveand函数。reject
重构以返回承诺,您的函数将如下所示:
function hashPassword(password:string, salt:string):Promise<string> {
return new Promise((resolve, reject) => {
const iterations = 50000;
const keylen = 64;
const digest = 'sha512';
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => {
if (err) {
reject(err);
} else {
resolve(key.toString('hex'));
}
})
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1922 次 |
| 最近记录: |