首页 > 解决方案 > 异步 dynamoDB 方法运行两次

问题描述

我在为 AWS 中的 API 网关编写 lambda 函数时遇到问题。我不知道为什么有些 dynamoDB 方法会运行两次。这似乎是对 async/await 技术的一些错误使用。它甚至发生在 SQS 或 SNS 方法中。

这是我的功能:

const orderPut = async (orderID: string, status:BasicOrderStatus): Promise<APIGatewayProxyResult> => {

let response: APIGatewayProxyResult; // Init variables

try {
    ...

    console.log("blabla"); // THIS LOG APPEARS JUST ONCE IN CONSOLE
    
    let params = {...;

    await docClient.update(params, function (err, data) {
        if (err) {
            console.error("Unable to update order status. Error: ", JSON.stringify(err, null, 2));
        } else {
            console.log("Update Order Status succeeded: ", JSON.stringify(data, null, 2)); // THIS LOGS APPEARS TWICE IN CONSOLE
        }
    }).promise();

    response = createSuccessResponse() // Creates successful response

} catch (e) {
    response = createErrorResponse(e) // creates error response
}

return Promise.resolve(response) }

我检查了一下,我确定这不是我的 lambda 函数执行了两次。例如,我可以看到我的日志在控制台上只出现了一次,但来自 dynamoDB 方法的日志出现了两次。

它发生在所有 muy 函数中,但不是在每个 dynamoDB 方法中发生,或者不是每次都发生。超级奇怪,不明白为什么。

我正在使用 Node.js

有什么帮助吗?提前非常感谢!

标签: node.jsamazon-web-servicesasync-await

解决方案


是的,因为您正在提供回调并尝试使用承诺版本。

使用承诺或回调。IE

带着承诺

try {
    const data = await docClient.update(params).promise();
    console.log("Update Order Status succeeded: ", JSON.stringify(data, null, 2)); // THIS LOGS APPEARS TWICE IN CONSOLE
} catch (err) {
    console.error("Unable to update order status. Error: ", JSON.stringify(err, null, 2));
}

或回调。

docClient.update(params, function (err, data) {
    if (err) {
        console.error("Unable to update order status. Error: ", JSON.stringify(err, null, 2));
    } else {
        console.log("Update Order Status succeeded: ", JSON.stringify(data, null, 2)); // THIS LOGS APPEARS TWICE IN CONSOLE
    }
});

推荐阅读