ECMAScript 8、异步 await、语法错误 javascript

ECMAScript 8, async await, syntactical errors javascript

提问人:cubesareneat 提问时间:11/26/2021 最后编辑:cubesareneat 更新时间:11/27/2021 访问量:140

问:

在函数的链中使用多个会破坏我的函数。 有没有办法我可以包含在里面?async()Key2pkcs8()generateKey()

async function generateKey() {
  let getKeyPair = await crypto.subtle.generateKey(
    {
      name: "ECDH",
      namedCurve: "P-384"
    },
    false,
    ["deriveKey"]
  );

  let PriKey = async() => {
    let PriKey = await getKeyPair.privateKey;
    console.log("pri = " + PriKey);
    return PriKey;
  };
  let PubKey = async() => {
    let PubKey = await getKeyPair.publicKey;
    console.log("pub = " + PubKey);
  };

  let Key2pkcs8 = async(PriKey, PubKey) => {
    let Key2pkcs8Pub = await crypto.subtle.exportKey("pkcs8", PubKey);
    let Key2pkcs8Pri = await crypto.subtle.exportKey("pkcs8", PriKey);
    return pkcs8keyarray = [Key2pkcs8Pub, Key2pkcs8Pri];
  
  return Keyarray = [PriKey(), PubKey()];  // i want to put <return pkcs8keyarray()> here  
};

generateKey().then(Key2pkcs8 => console.log(Key2pkcs8[0], Key2pkcs8[1]));按预期工作并返回pri = [object CryptoKey] Promise { <state>: "fulfilled", <value>: undefined } Promise { <state>: "fulfilled", <value>: CryptoKey }

但是当使用 instead 而不是 it 时会中断并返回 undefinedreturn pkcs8keyarray()return Keyarray = [PriKey(), PubKey()];

我本来打算将一个键作为变量(公钥或私钥),然后在末尾的数组中返回两个,类似于示例key2pkcs2

JavaScript 异步 承诺 ECMAScript-2017

评论

1赞 VLAZ 11/26/2021
PriKey并且没有明确的,因此它们只产生一个解析为 .此外,由于这是一个承诺,您应该对结果进行 -ing (或使用PubKeyreturnundefinedawait.then())

答:

0赞 ibrahim tanyalcin 11/26/2021 #1
async function generateKey() {
  let keyPair = await crypto.subtle.generateKey(
    {
      name: "ECDH",
      namedCurve: "P-384"
    },
    false,
    ["deriveKey"]
  );

  let PriKey = (keyPair) => {
    let PriKey = keyPair.privateKey;
    console.log("pri = " + PriKey);
    return keyPair;
  };
  let PubKey = (keyPair) => {
    let PubKey = keyPair.publicKey;
    console.log("pub = " + PubKey);
    return keyPair;
  };

  let Key2pkcs8 = async(keyPair) => {
    console.log("key = " + keyPair);
    let Key2pkcs8 = await crypto.subtle.exportKey("pkcs8", keyPair);
    return Key2pkcs8;
  };

  let printme = async() => {
    let printme = await Key2pkcs8(PubKey());
    console.log(printme);
    return printme;
  };

  return printme();
}

用法:

generateKey().then(Key2pkcs8 => console.log(Key2pkcs8 ));

如果您的外部 iife 是异步的,则已经将异步流转换为同步,这意味着(或在我的代码片段中)在您调用其他函数时已经可用。awaitgetKeyPairkeyPair

PubKey并且不需要是异步的,在这两种情况下,您都不会返回任何内容。 也没有返回任何东西,那么你到底想返回什么?理想情况下,如果您希望结果解析为 .试一试上面的片段,我没有测试过。PriKeyKey2pkcs8await Key2pkcs8(PubKey());Promiseundefined

评论

0赞 cubesareneat 11/26/2021
我使用您的主题对我的帖子进行了一些编辑,并尝试*使其更清晰,尽管我无法在没有并且不异步的情况下运行任何东西PubKeyPriKey
1赞 ibrahim tanyalcin 11/26/2021
如果你想让它们成为异步的,你需要链接它们: 您将需要再次添加 async 关键字并进行修改,因为它不再需要等待 Key2pkcs8,它将接收它作为参数PubKey(keyPair).then(keyPair => PriKey(keyPair)).then(keyPair => Key2pkcs8(keyPair)).then(Key2pkcs8 => printme(Key2pkcs8)).then(Key2pkcs8=> /*do something with Key2pkcs8*/)printme
2赞 3 revsMulan #2

您的程序展示了对 promises、async/await、加密模块和整个 javascript 的误解。

  • 仅当要为绑定重新赋值时才使用let
  • 不要将函数重新分配给值,尤其是在可以轻松避免的情况下
  • 像这样的语句泄漏了全局变量,并且行为不像您可能期望的那样return Keyarray = ...
  • 您不需要每次想要另一个异步值时都创建一个新函数asyncawait
  • 您不能简单地使用私钥或公钥。根据 exportKey 文档,它返回一个 promise,该 promise 解析为 ArrayBuffer,该 ArrayBuffer 是原始字节数据,没有字符串表示形式。console.log
async function generateKey() {
  const {privateKey, publicKey} =        // <- get privateKey, publicKey
    await crypto.subtle.generateKey(
      {
        name: "ECDH",
        namedCurve: "P-384"
      },
      true,
      ["deriveKey"]
    )

  return [
    await crypto.subtle.exportKey("pkcs8", privateKey), // <- export private
    await crypto.subtle.exportKey("pkcs8", publicKey),  // <- export public
  ]
}

由于返回一个数组对,我们可以轻松地在您编写的其他异步函数中使用它们 -generateKey[private, public]

async function myfunction() {
  const [private, public] = await generateKey() // <- resolves pair
  // do something
}

将所有副作用移到处理程序的下游。调用方应对错误负责。始终处理错误 -.thencatch

myfunction().then(console.log).catch(console.error)

如果您不了解这些简单的事情,请不要尝试实现加密解决方案。你会 100% 出错,你会引入一个漏洞,你和你的用户将遭受后果。

这个答案中的代码是未经测试的,只是在这里强调我很容易看到的错误。不要逐字使用代码,也不要指望它直接复制/粘贴到您的项目中。我不了解您的要求或意图是什么,因此不可能提出建议或提供其他建议。

有关滥用 和 的详细信息,请参阅此相关问答asyncawait

评论

2赞 Bergi 11/27/2021
"对整个 JavaScript 的压倒性误解“——即使这是真的,你也可能想把你的语言调低一点。此外,我会将免责声明放在答案的页脚中,而不是顶部
1赞 Mulan 11/27/2021
感谢您的反馈,我调整了帖子。 @cubesareneat返回值可能是您所期望的,很可能您不打算泄漏全局变量。这种错误可能会将安全程序变成易受攻击的程序。如果您在控制台中看到,则您没有 ArrayBuffer。我很乐意帮助一个我真诚的意思,没有不尊重。如果您有其他问题,请随时提问undefined
0赞 cubesareneat 11/27/2021
似乎任何时候 await 都会被使用得更多,而不是一旦我在尝试 consol.log 中的任何一个返回值时......但是,如果它只返回一个导出的 pkcs8 键,而另一个值没有 exportkey() 操作,它就会按预期工作并记录数组缓冲区......如果其中一种 ExportKeys 格式是crypto.subtle.exportKey("pkcs8"Uncaught (in promise) DOMException: Operation is not supportedcrypto.subtle.exportKey("raw"
1赞 Mulan 11/27/2021
@cubesareneat我确实注意到,如果你只有私钥有,而公钥有.我对 ECDH 算法、基于 Web 的模块或您的预期用途不够熟悉,无法为此提供修复程序。console.log(privateKey, publicKey)usages: ["deriveKey"]usages: []crypto
1赞 cubesareneat 11/27/2021
我回到你给我的一个很好的起点的文档