【问题标题】:AWS lambda function firing twice when I click the Test button当我单击测试按钮时,AWS lambda 函数触发了两次
【发布时间】:2019-11-06 11:35:42
【问题描述】:

我正在使用 chrome 浏览器,当我单击屏幕右上角的测试按钮时,lambda 函数似乎触发了 1-3 次,我无法弄清楚为什么会发生这种情况。

我尝试将参数直接放入 dynamoDB.get 调用中,并在谷歌上搜索了一段时间并试图找到有类似问题的人。我发现一些很接近,但没有一个提到在使用内置测试按钮时多次触发单个函数。我也尝试过使调用异步并等待它,但都无济于事。

// Import Libraries
const aws = require('aws-sdk');
const dynamoDB = new aws.DynamoDB.DocumentClient();

aws.config.update({
    region: "us-east-1"
});

// Get Document
exports.handler = async (event, context) => {
    let params = {
       TableName: event.TableName,
        Key: {
            uuid: event.uuid
        } 
    };  

    return await dynamoDB.get(params, function(error, data){
        if(error){
            console.error("Error", error);
        }
        else{
            console.log("Data: ", data);
        }
    }).promise();
};

我希望该函数只调用一次,但它通常会在执行结果区域中打印 2-3 次相同的内容

Response:
{
  "Item": {
    "userId": "112",
    "uuid": "0118bb6f-e361-42a6-85e5-043091b69389"
  }
}

Request ID:
"4f5ce9da-bbf2-408b-9175-2759f45ba4fe"

Function Logs:
START RequestId: 4f5ce9da-bbf2-408b-9175-2759f45ba4fe Version: $LATEST
2019-11-06T01:46:01.361Z    4f5ce9da-bbf2-408b-9175-2759f45ba4fe    
INFO    Data:  { Item:
   {
       "userId": "112",
       "uuid": "0118bb6f-e361-42a6-85e5-043091b69389"
   } } 

2019-11-06T01:46:01.441Z    4f5ce9da-bbf2-408b-9175-2759f45ba4fe    
INFO    Data:  { Item:
   {
       "userId": "112",
       "uuid": "0118bb6f-e361-42a6-85e5-043091b69389"
   } } 
2019-11-06T01:46:01.461Z    4f5ce9da-bbf2-408b-9175-2759f45ba4fe    
INFO    Data:  { Item:
   {
       "userId": "112",
       "uuid": "0118bb6f-e361-42a6-85e5-043091b69389"
   } } 
END RequestId: 4f5ce9da-bbf2-408b-9175-2759f45ba4fe
REPORT RequestId: 4f5ce9da-bbf2-408b-9175-2759f45ba4fe  Duration: 127.68 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 95 MB  

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda


    【解决方案1】:

    您正在提供一个回调方法并且您正在同一个 API 调用中请求一个承诺。

    你不应该两者都做。我建议删除回调,例如:

    exports.handler = async (event, context) => {
        const params = {
           TableName: event.TableName,
            Key: {
                uuid: event.uuid
            } 
        };
    
        try {
            const data = await dynamoDB.get(params).promise();
            console.log("Data: ", data);
        } catch(error) {
            console.error("Error:", error);
        }
    };
    

    【讨论】:

    • 所以要清楚,做 .promise().then(data => {code here to handle data})?
    • 是的,或者如果您想处理错误,只需将 const data = await DynamoDB.get(params).promise() 包裹在 try/catch 中。
    猜你喜欢
    • 2016-04-19
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2013-12-02
    • 2019-06-12
    相关资源
    最近更新 更多