node.js - API 在将数据放入 dynamoDB 时随机工作
问题描述
我正在尝试使用无服务器部署将数据放入 Dynamodb。我已添加写入 Dynamodb 的权限。
该 api 始终在发送{"message": "Internal server error"}
,但如果尝试 5.6 次,则能够将数据放入 db 一次。
以下是 serverless.yaml 配置
handler: dynamoUpdate.handler
events:
- http:
path: /createdbentry
method: get
cors: true
以下是代码:
const AWS = require('aws-sdk')
AWS.config.update({ region: process.env.REGION || 'us-east-1' })
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = async (event) => {
return await createDBEntry("i123","Working");
}
const sendRes = (status, body) => {
var response = {
statusCode: status,
headers: {
"Content-Type": "application/json"
},
body: body
};
return response;
};
const createDBEntry = async function(id,result) {
var params = {
TableName: 'emplist',
Item: {
'ID' : {S:id},
'Summary':{S: result},
}
};
ddb.putItem(params, function(err, data) {
console.log("Here comes me.")
if (err) {
console.log("Opps Error");
return sendRes(403,err);
} else {
console.log("Complete")
return sendRes(200,data);
}
});
}
如何解决?
解决方案
问题是你没有在你的函数中返回任何承诺或等待任何异步createDBEntry
。因此,您的处理程序返回undefined
,这使得 apigateway 返回 500 内部服务器错误。
您正在混合回调和异步/等待。你的createDBEntry
函数应该是这样的。
const createDBEntry = async function(id, result) {
var params = {
TableName: 'emplist',
Item: {
'ID' : {S:id},
'Summary':{S: result},
}
};
try {
let data = await ddb.putItem(params).promise()
return sendRes(200, JSON.stringify(data))
} catch (err) {
console.log("Oops Error");
return sendRes(403, err.toString());
}
}
当您从 lambda 中的异步处理程序返回时,当前执行环境会立即冻结(与使用带有回调的非异步处理程序不同)。这就是为什么大多数情况下对数据库的写入都不会成功的原因。
推荐阅读
- string - 哪一种是将String转换为ByteString的正确方法?
- php - PHP 网页无法显示带有 Wamp 服务器的产品列表
- firebase - 如何从查询的文档 Flutter/Firetore 中获取字段
- react-native - react-navigation 标题有一条微弱的线
- r - R 到 BigQuery 数据上传错误
- python - 如何使用递归打印从 0 开始到给定输入的数字(详细信息在帖子中)?
- python - 为什么我的 TensorFlow NN 模型的预测值有上限?
- wordpress - WordPress 文件附件
- c - C-如何将指针值复制到非指针中
- php - 用php抓取图表