node.js - 来自 Lambda Node JS 的多个 Dynamo DB 调用

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

我需要循环 json 并对 dynamo db 进行多次 getitem 调用。我的问题是,node 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);
            }
        });

最佳答案

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

更现代的方法是使用 Promises ,这需要一些时间才能理解。不过这样做是值得的,这样当您使用最新的方法(即 async)时,您就可以了解幕后发生的情况。和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()的结果。回调getItem已被替换为返回 promise 的方法。

关于node.js - 来自 Lambda Node JS 的多个 Dynamo DB 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54700483/

相关文章:

node.js - Gandi 简单主机上的 NodeJs SSL : listen EACCES

javascript - 错误 : Error parsing url: undefined when migrating database to heroku

python - 使用 boto3 和 python 列出 s3 存储桶

python - 从事件网格触发的函数访问存储容器中的 blob

amazon-web-services - 如何从 Api Gateway 集成请求映射模板映射数组或对象?

amazon-web-services - AWS Lambda : Identifying cold starts

node.js - socketio 和 nodejs,错误 404/socket.io/socket.io.js

node.js - 使用 socket.io 进行用户身份验证

amazon-web-services - 带有环境变量的 AWS CodeBuild secret 管理器配置

python-3.x - AWS CDK API 网关 - 如何在不创建默认部署的情况下部署 API(python)