作为Lambda培训工作的一部分,我试图编写一个简单的应用程序,该应用程序通过API网关触发Lambda函数。然后,该Lambda函数通过AWS开发工具包连接到DynamoDB,并尝试删除现有表。
当我POST
对API Gateway端点执行时,会触发Lambda函数。我得到的响应为{}
,这意味着它result
从未在初始化值之后重新分配过。据我所知,该deleteTable
方法永远不会触发。我从没看到回调主体中存在console.log()
或console.error()
。
请在下面找到详细信息:
POST
端点这是代码。我参与了很多工作,但是当我无法执行删除操作时,将其缩减为:
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)
};
};
$.post
我查看了CloudWatch和X-Ray日志,但从未看到错误,也没有从deleteTable()
调用主体内部看到console.log()尝试。
我现在几乎要拔头发了,因为它阻碍了我的训练。任何帮助将不胜感激。
编辑:为了进一步说明,我可以将返回值的主体更改为类似于“ Hello World!”的内容。我得到了回应。另外,我可以console.log('Attempting to delete table...")
在deleteTable
通话之前添加权限;当我这样做时,我会在CloudWatch中看到它。我只是从未从deleteTable
方法内部看到日志。
我终于想通了。因为我使用的是Node.js 8.10,所以我需要使用Promise结构而不是Callback结构。
编辑:
作为卡莱弗提到,事实上,我使用的是async
用于处理函数就是需要采用的await
和.promise()
,而不是事实,我是如何使用Node.js 8.10,其仍然支持回调结构。
例如,除了我最初尝试的以外,我还需要做更多这样的事情:
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();
因为那是我搞砸的部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句