如何解决Node Lambda对于AWS控制台返回null
以下代码在本地运行良好,但是将其部署到AWS Lambda并运行后,我的记录没有保存到DynamoDB,并且我从Lambda得到了null
的回报。
我知道Lambda执行角色不是权限问题,因为我可以从AWS控制台成功地将一条记录插入DynamoDB中。
我认为问题与.forEach
循环以及aws-sdk
的工作方式有关。我不确定我是否会完全围绕如何在Lambda中正确使用JavaScript Promise进行思考。任何帮助将不胜感激!
module.exports.handler = async event => {
const getItems = () => {... // return items //...}
const addToDb = (items) => {
items.forEach(item => {
var params = {
Item: {"id": {S: item.id},"title": {S: item.title}},ReturnConsumedCapacity: "TOTAL",TableName: "my-table"
};
dynamodb.putItem(params,(err,data) => {
if (err) console.log(err,err.stack);
else console.log(data);
});
});
};
const getItemsPromise = new Promise((resolve) => {
const items = getItems();
const itemsAddedToDb = addToDb(items);
resolve(itemsAddedToDb);
});
return getItemsPromise
.catch(err => console.log(err));
};
解决方法
这应该有效!
exports.handler = (event) => {
const getItems = () => {...} // assuming getItems returns promise
const addToDb = (items) => {
asyncForEach(items,async (item) => {
const params = {
Item: {
id: {
S: item.id
},title: {
S: item.title
}
},ReturnConsumedCapacity: 'TOTAL',TableName: 'my-table'
}
await dynamodb.putItem(params,(err,data) => {
if (err) console.log(err,err.stack)
else console.log(data)
})
})
}
const getItemsPromise = new Promise(async (resolve) => { // rule eslintno-async-promise-executor - use then instead
const items = await getItems()
const itemsAddedToDb = await addToDb(items)
resolve(itemsAddedToDb)
})
const asyncForEach = async (array,callback) => {
for (let index = 0; index < array.length; index++) {
await callback(array[index],index,array)
}
}
return getItemsPromise.catch((err) => console.log(err))
}
注意:
async
的 export.handler
没有用。仅在async
内有function
时使用await
。
async
await
不支持forEach
尝试for loop
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。