首页 > 解决方案 > 来自 Lambda Node JS 的多个 Dynamo DB 调用

问题描述

我需要遍历一个 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.jsamazon-web-servicesaws-lambdaamazon-dynamodb

解决方案


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

一种更现代的方法是使用Promises,这需要一些时间来理解。不过这样做是值得的,这样您就可以了解当您使用最新的方式时幕后发生的事情,即asyncand await,它看起来像这样:

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(). 回调 togetItem已被替换为返回承诺的方法。


推荐阅读