node.js - 使用 Lambda 函数从 dynamoDB 中删除记录时出错,但记录仍被删除
问题描述
我正在尝试使用 Lambda 和 API 网关从 DynamoDB 中删除记录。目前记录的Id作为查询参数传递,传递给我的deleteRecord lambda函数,在documentClient的delete函数中使用。
目前,我在尝试删除记录时收到错误消息,但该记录还是被删除了,我不知道为什么。
在 API 网关上进行测试时,我收到“内部服务器错误”作为响应,但检查表显示该项目已删除,日志显示已删除的记录(根据提供ReturnValues:“ALL_OLD”在传递给 documentClient的参数中)。
直接在 Lambda 上进行测试时(手动将 ID 插入到我的dt.delete函数中),我得到以下信息:
Response:
{
"errorMessage": "RequestId: xxxxxxxxxxxxxxxxxxxx Process exited before completing request"
}
Request ID:
"xxxxxxxxxxxxxxxxxxxx"
Function Logs:
START RequestId: xxxxxxxxxxxxxxxxxxxx Version: $LATEST
2019-04-04T10:21:55.637Z xxxxxxxxxxxxxxxxxxxx Promise { <pending> }
2019-04-04T10:21:55.938Z xxxxxxxxxxxxxxxxxxxx TypeError: undefined is not a function
at Response.<anonymous> (/var/task/deleteTrip.js:28:28)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:364:18)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)
END RequestId: xxxxxxxxxxxxxxxxxxxx
REPORT RequestId: xxxxxxxxxxxxxxxxxxxx Duration: 941.48 ms Billed Duration: 1000 ms Memory Size: 128 MB Max Memory Used: 67 MB
RequestId: xxxxxxxxxxxxxxxxxxxx Process exited before completing request
尽管有错误,但在这种情况下,记录也会从表中删除。
我已按照DocumentClient 文档删除记录,但是它没有解释如何传回响应(而只是记录来自回调的数据),所以我不确定这是否是我的问题。
Lambda 函数
Index.js:
const deleteTrip = require('./deleteTrip.js');
const dt = new deleteTrip();
exports.handler = async (event) => {
return dt.delete(event.queryStringParameters['Id']);
};
deleteTrip.js:
const AWS = require('aws-sdk');
let documentClient = new AWS.DynamoDB.DocumentClient({
'region': 'eu-west-1'
});
module.exports = class deleteTrip {
delete(Id) {
return new Promise((resolve, reject) => {
if (typeof Id !== 'string') throw `Expected: "String", received: ${typeof Id}`;
let params = {
TableName: "xyzDataTable",
Key: {
tripId: Id
},
ReturnValues: "ALL_OLD",
Exists: true
};
documentClient.delete(params, function(err, data) {
if (err) {
console.log("Error deleting record from dynamoDB:", err);
console.log(params);
return reject(err);
} else {
return resolve(...data.Attributes);
}
})
});
}
}
如果请求成功,我希望返回已删除项目的详细信息,否则会抛出错误。
解决方案
在 Lambda 中,只要导出的处理程序返回一个值,该函数就会退出。您正在返回一个承诺,并且该过程甚至在它解决之前就退出了。
在 index.js 中进行以下更改
const deleteTrip = require('./deleteTrip.js');
const dt = new deleteTrip();
exports.handler = async (event) => {
try{
var result = await dt.delete(event.queryStringParameters['Id']);
return res;
}
catch(err){
//if the delete function throws an error or the promise rejects
return err;
}
};
推荐阅读
- amazon-ec2 - 我需要有关 AWS Ec2 上 weblogic 11g 的 Ansile 自动化的帮助
- sql - 在触发 DELETE 之前确保 INSERT 成功
- reactjs - react-three-fiber 在画布上显示多个蒙皮网格
- firebase - Dart null vs Null
- spring-security - Spring - Auth:如何用 JSON-Response 替换 HTML 身份验证失败页面
- python - 我无法在 tensorflow 环境中安装 keras
- github - 如何删除我的 github 存储库(按钮错误)
- node.js - 从后面获取访问令牌并将其缓存到浏览器
- discord - 检测反应 Discord.js
- html - css 动画:将隐藏的 div 从侧面滑动到中心