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

时间:2018-11-21 18:04:19

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

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

当我对API网关端点执行POST时,Lambda函数将触发。我收到的响应为{},这意味着result从未在初始化值之外重新分配。据我所知,deleteTable方法永远不会触发。我从没见过console.log()console.error(),它们都存在于回调的正文中。

请在下面找到详细信息:

设置

Lambda函数

  • 语言:Node.Js 8.10
  • 触发器:API网关POST端点
  • 执行角色权限:
    • 基本微服务模板(注意:我还尝试为其提供明确的DynamoDB完全访问权限,甚至是完全管理员;这无济于事。

这是代码。我有很多事情要做,但是当我无法执行删除操作时,将其缩小为:

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网关

  • 授权:无
  • 方法:开机自检

客户端

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

我查看了 CloudWatch X-Ray 日志,但我从未看到错误,也没有看到console.log()尝试在deleteTable()调用的正文中。

这时我几乎要拔头发了,因为它阻碍了我的训练。任何帮助将不胜感激。

编辑:为进一步说明,我可以将返回值的主体更改为类似于“ Hello World!”的内容。我得到了回应。另外,我可以在console.log('Attempting to delete table...")调用之前放置deleteTable;当我这样做时,我会在CloudWatch中看到它。我只是从来没有从deleteTable方法内部看到日志。

1 个答案:

答案 0 :(得分:1)

我终于想通了。因为我使用的是Node.js 8.10,所以我需要使用 Promise 结构而不是 Callback 结构。

编辑:

正如Kalev所说,我在处理程序中使用case Device.iOS: MainPage = new Login_iOS⁩();函数的事实是必须使用Login_iOSasync的事实,而不是我在使用的事实Node.js 8.10,仍支持回调结构。

例如,除了我最初的尝试,我还需要做更多这样的事情:

await

要特别注意.promise(),因为那是我搞砸的部分。