代码之家  ›  专栏  ›  技术社区  ›  Brandon Avant

从NodeJs 8.10 Lambda函数调用时,AWS DynamoDB deleteTable不工作

  •  0
  • Brandon Avant  · 技术社区  · 7 年前

    作为Lambda培训工作的一部分,我试图编写一个简单的应用程序,通过API网关触发Lambda函数。然后,Lambda函数通过AWS SDK连接到DynamoDB,并尝试删除现有表。

    POST 针对API网关端点。我得到的回复是 {} ,也就是说 result 从未重新分配超过初始化值的值。据我所知 deleteTable console.log() 或者 console.error() ,它们存在于回调的主体中。

    详情如下:

    • 语言:Node.Js 8.10
    • 邮递 端点
    • 执行角色权限:

    这是密码。我做了一些更复杂的事情,但当我无法让删除生效时,我将其简化为:

    exports.handler = async (event) => {
        var aws = require('aws-sdk');
        var dynamodb = new aws.DynamoDB();
        
        var params = {
            TableName: "StudyGuideSections"
        };
        
        var result = {};
        
        dynamodb.deleteTable(params, function(err, data) {
            console.log('Entering deleteTable callback...');
            
           if (err) {
               console.log(err, err.stack);
           } else {
               console.log(data);
               
               result = data;
           }
        });
        
        return {
            statusCode: 200,
            "headers": {
                "Access-Control-Allow-Origin": "*"
            },
            body: JSON.stringify(result)
        };
    };
    

    API网关

    • 方法:邮寄

    • 邮递员(测试用)
    • 简单的web应用程序执行 $.post

    云表 和 日志,我从来没有看到错误,也没有看到console.log()在 deleteTable()

    编辑:为了进一步澄清,我可以将返回值的主体更改为类似“Hello World!”我得到了回应。此外,我可以把一个 console.log('Attempting to delete table...") 就在 删除表

    1 回复  |  直到 6 年前
        1
  •  1
  •   Brandon Avant    7 年前

    我终于明白了。因为我使用的是Node.js 8.10,所以我需要使用 回拨 结构。

    正如卡列夫提到的,我使用 async await 和 .promise()

    例如,与我最初尝试的不同,我需要做更多类似的事情:

    var aws = require('aws-sdk');
    
    exports.handler = async (event) => {
        var ddb = new aws.DynamoDB();
    
        aws.config.update({
          region: "us-east-1"
        });
    
        var params = {
            TableName: "StudyGuideSections"
        };
    
        var result = {}
    
        try
        {
            result = await ddb.deleteTable(params).promise();
        }
        catch(ex) {
            result = ex;
        }
    
        return {
            statusCode: 200,
            "headers": {
                "Access-Control-Allow-Origin": "*"
            },
            body: JSON.stringify(result)
        };
    };
    

    特别注意 result = await ddb.deleteTable(params).promise();