【问题标题】:Multiple Dynamo DB calls from Lambda Node JS来自 Lambda Node JS 的多个 Dynamo DB 调用
【发布时间】:2019-02-15 08:25:06
【问题描述】:

我需要遍历一个 json 并对 dynamo db 进行多次 getitem 调用。我的问题是节点 js 飞过代码而不是等待函数返回,所以我无法创建一个包含页眉、多个计算行和页脚的 xml。

在下面的示例中,!make 页脚将在函数 taxrate 完成之前很长时间编写。如何强制脚本等待 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);
            }
        });

【问题讨论】:

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


    【解决方案1】:

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

    更现代的方法是使用Promises,这需要一些时间来理解。不过这样做是值得的,这样您就可以在使用最新的方式(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 循环中,我们现在 awaited 得到了 taxrate() 的结果。对getItem 的回调已被替换为返回承诺的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2018-07-22
      • 2021-06-08
      • 2020-06-17
      相关资源
      最近更新 更多