【问题标题】:Trying to delete api key but getting "await is only valid in async function"尝试删除 api 密钥但得到“等待仅在异步函数中有效”
【发布时间】:2020-10-23 09:38:21
【问题描述】:

我正在尝试使用 AWS SDK JS 删除 api 密钥,但收到以下错误消息:

{
    "errorType": "Runtime.UserCodeSyntaxError",
    "errorMessage": "SyntaxError: await is only valid in async function",
    "stack": [
        "Runtime.UserCodeSyntaxError: SyntaxError: await is only valid in async function",
        "    at _loadUserApp (/var/runtime/UserFunction.js:98:13)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:36:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:701:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)",
        "    at Module.load (internal/modules/cjs/loader.js:600:32)",
        "    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:531:3)",
        "    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)",
        "    at startup (internal/bootstrap/node.js:283:19)"
    ]
}

我试图创建一个删除的承诺,就像我选择键一样,但我认为在 foreach 中执行它可能是一个问题。

我的代码:

let sendPromise = null;
let params = {
    includeValues: true,
    limit: 500
};
let dados = null;

sendPromise = new AWS.APIGateway().getApiKeys( params ).promise();

try {
    dados = await sendPromise;
} catch(err) {
    console.error(err, err.stack);
    return criarResposta( 500, `{
        "message": "Erro interno"
    }` );
}

dados.items.forEach( chave => {
    const paramsDeletar = {
        apiKey: chave.id
    };

    sendPromise = new AWS.APIGateway().deleteApiKey( params ).promise();

    try {
        let dadosDeletar = await sendPromise;
    } catch(err) {
        console.error( err, err.stack );
        return criarResposta( 500, `{
            "message": "Erro interno"
        }` );
    }
});

return criarResposta( 200, JSON.stringify( dados ) );

其他的事情,我需要单独等待我的所有承诺还是有办法等待承诺的捆绑? 我迫不及待地等待我的承诺,因为我正在使用 lambda,但我希望我能让它们一起运行

【问题讨论】:

    标签: javascript node.js aws-sdk-js


    【解决方案1】:

    你必须创建一个异步函数才能在 Nodejs 中使用 async-await 您只需要在 forEach 函数中使用 async 关键字

    let sendPromise = null;
    let params = {
        includeValues: true,
        limit: 500
    };
    let dados = null;
    
    sendPromise = new AWS.APIGateway().getApiKeys( params ).promise();
    
    try {
        dados = await sendPromise;
    } catch(err) {
        console.error(err, err.stack);
        return criarResposta( 500, `{
            "message": "Erro interno"
        }` );
    }
    
    dados.items.forEach( async chave => {
        const paramsDeletar = {
            apiKey: chave.id
        };
    
        sendPromise = new AWS.APIGateway().deleteApiKey( params ).promise();
    
        try {
            let dadosDeletar = await sendPromise;
        } catch(err) {
            console.error( err, err.stack );
            return criarResposta( 500, `{
                "message": "Erro interno"
            }` );
        }
    });
    
    return criarResposta( 200, JSON.stringify( dados ) );
    

    【讨论】:

    • 你可以找到一些关于 async/await 函数的背景知识on MDN
    • 注意:它不会等待删除承诺完成。由于 foreach 循环不支持异步功能
    【解决方案2】:

    这里你最好用 for 循环替换 forEach 循环,这样就可以在其中使用 await:

    ...
    for (const chave of dados.items) {
        const paramsDeletar = {
            apiKey: chave.id
        };
    
        sendPromise = new AWS.APIGateway().deleteApiKey( params ).promise();
    
        try {
            let dadosDeletar = await sendPromise;
        } catch(err) {
            console.error( err, err.stack );
            return criarResposta( 500, `{"message": "Erro interno"}` );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2021-01-11
      • 2019-07-15
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多