来自Lambda Node JS的多个Dynamo DB调用

时间:2019-02-14 23:06:50

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

我需要遍历json并对dynamo db进行多个getitem调用。我的问题是,节点js会通过代码执行代码,而不是等待函数返回,因此我无法创建一个具有标题,多个计算行以及页脚的xml。

在下面的示例中,!make页脚将在功能税率完成之前很长时间被写入。如何强制脚本等待taxrate函数完成?

!make xml header 
 for(i=0; i<linelength; i++)
    {

        business_unit = '100'
        invoice_line = 1
        total = 100
        taxrate(business_unit, invoice_line, total);       
        !write line xml
    }
!make xml footer

function taxrate(business_unit, i, gross_total) {

        const params = {
            Key: {
                "tax_rate": {
                    S: business_unit
                }
            },
            TableName:"tax_table"
        };
        dynamodb.getItem(params,function(err, data){
            if(err) {
                console.log("call error");
                console.log(err);

            } else {
               console.log(data.Item.tax.N);
               return(data.Item.tax.N);
            }
        });

1 个答案:

答案 0 :(得分:3)

有几种解决此问题的模式;第一个是您的代码中已经包含的代码,它是回调函数。您传递给dynamodb.GetItem()的函数是一个回调,该回调在运行某些其他代码之后执行,以便可以访问结果(data)。

一种更现代的方法是使用enter image description here,这需要一些时间才能理解。不过值得这样做,这样当您使用最新的方式asyncawait时,您就可以了解幕后的情况:

exports.lambdaHandler = async (event, context) => {
    !make xml header 
    for(i=0; i<linelength; i++)
        {

            business_unit = '100'
            invoice_line = 1
            total = 100
            await taxrate(business_unit, invoice_line, total);       
            !write line xml
        }
    !make xml footer   
}

async function taxrate(business_unit, i, gross_total) {
    const params = {
        Key: {
            "tax_rate": {
                S: business_unit
            }
        },
        TableName:"tax_table"
    };
    try {
        let data = await dynamodb.getItem(params).promise();
        return data.Item.tax.N;
    } catch(err) {
        console.log("call error");
        console.log(err);
    }
}

请注意,lambdaHandler()taxrate()都已经变成了async功能。在for循环中,我们现在await taxrate()的结果。 getItem的回调已被返回诺言的方法所代替。