提问人:cubesareneat 提问时间:11/26/2021 最后编辑:cubesareneat 更新时间:11/27/2021 访问量:140
ECMAScript 8、异步 await、语法错误 javascript
ECMAScript 8, async await, syntactical errors javascript
问:
在函数的链中使用多个会破坏我的函数。
有没有办法我可以包含在里面?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
答:
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 是异步的,则已经将异步流转换为同步,这意味着(或在我的代码片段中)在您调用其他函数时已经可用。await
getKeyPair
keyPair
PubKey
并且不需要是异步的,在这两种情况下,您都不会返回任何内容。 也没有返回任何东西,那么你到底想返回什么?理想情况下,如果您希望结果解析为 .试一试上面的片段,我没有测试过。PriKey
Key2pkcs8
await Key2pkcs8(PubKey());
Promise
undefined
评论
PubKey
PriKey
PubKey(keyPair).then(keyPair => PriKey(keyPair)).then(keyPair => Key2pkcs8(keyPair)).then(Key2pkcs8 => printme(Key2pkcs8)).then(Key2pkcs8=> /*do something with Key2pkcs8*/)
printme
您的程序展示了对 promises、async/await、加密模块和整个 javascript 的误解。
- 仅当要为绑定重新赋值时才使用
let
- 不要将函数重新分配给值,尤其是在可以轻松避免的情况下
- 像这样的语句泄漏了全局变量,并且行为不像您可能期望的那样
return Keyarray = ...
- 您不需要每次想要另一个异步值时都创建一个新函数
async
await
- 您不能简单地使用私钥或公钥。根据 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
}
将所有副作用移到处理程序的下游。调用方应对错误负责。始终处理错误 -.then
catch
myfunction().then(console.log).catch(console.error)
如果您不了解这些简单的事情,请不要尝试实现加密解决方案。你会 100% 出错,你会引入一个漏洞,你和你的用户将遭受后果。
这个答案中的代码是未经测试的,只是在这里强调我很容易看到的错误。不要逐字使用代码,也不要指望它直接复制/粘贴到您的项目中。我不了解您的要求或意图是什么,因此不可能提出建议或提供其他建议。
有关滥用 和 的详细信息,请参阅此相关问答。async
await
评论
undefined
crypto.subtle.exportKey("pkcs8"
Uncaught (in promise) DOMException: Operation is not supported
crypto.subtle.exportKey("raw"
console.log(privateKey, publicKey)
usages: ["deriveKey"]
usages: []
crypto
评论
PriKey
并且没有明确的,因此它们只产生一个解析为 .此外,由于这是一个承诺,您应该对结果进行 -ing (或使用PubKey
return
undefined
await
.then()
)