如何在async generateKey()中集成Key2pkcs8()解决链式async()调用报错
问题原因与修复方案
你的代码存在4处核心问题,修改后即可实现将Key2pkcs8集成到generateKey内部的需求:
- 语法错误:
Key2pkcs8异步函数缺少闭合的},函数定义不完整,这是直接触发报错的核心原因 - 参数传递缺失:调用
Key2pkcs8时没有传入要求的私钥、公钥参数 - 异步函数返回值缺失:你定义的
PubKey异步函数没有写return语句,执行后天然返回undefined - 异步结果未等待:
PriKey、PubKey都是异步函数,直接调用拿到的是Promise对象,需要用await获取实际的密钥值后再传给Key2pkcs8
可直接运行的修改后代码
async function generateKey() { const keyPair = await crypto.subtle.generateKey( { name: "ECDH", namedCurve: "P-384" }, false, ["deriveKey"] ); // 简化不必要的异步函数封装,直接取密钥值 const privateKey = keyPair.privateKey; const publicKey = keyPair.publicKey; console.log("pri = ", privateKey); console.log("pub = ", publicKey); const key2pkcs8 = async (priv, pub) => { // 注意:pkcs8是私钥导出格式,公钥导出应该用spki格式,你之前的写法会报错,这里已经修正 const pubExported = await crypto.subtle.exportKey("spki", pub); const privExported = await crypto.subtle.exportKey("pkcs8", priv); return [pubExported, privExported]; }; // 等待导出结果后返回 return await key2pkcs8(privateKey, publicKey); };
调用测试
执行以下代码即可拿到你要的公钥、私钥导出结果数组:
generateKey().then(([pubExported, privExported]) => { console.log("导出的公钥:", pubExported); console.log("导出的私钥:", privExported); })
额外提示:你之前的代码把公钥也用
pkcs8格式导出会直接报错,Web Crypto API规范中公钥的标准导出格式是spki,私钥才用pkcs8,上述代码已经做了修正。
内容的提问来源于stack exchange,提问作者cubesareneat
相关产品推荐
相关产品推荐

