Ris*_*pta 2 amazon-web-services node.js amazon-dynamodb aws-lambda
我有一个 DynamoDB 表,其列和主键为ipAddress:
我正在从我的 React 网站获取用户的 IP 地址,并通过 Lambda 函数和 API Gateway POST 请求将其插入到 DynamoDB。
如果来自 React 网站的 IP 地址已经存在于 DynamoDB 中,则增加visits列中的值。如果没有,则使用新的 IP 地址和visits = 1. 我尝试使用ConditionExpression但无济于事。
到目前为止,我只使用 Lambda 插入 ipAddress。下面是我在 NodeJS 中的 Lambda 函数:
const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();
exports.handler = async event => {
const { ipAddress} = JSON.parse(event.body);
const params = {
TableName: "ipAddress",
Item: {
ipAddress: ipAddress,
}
};
try {
const data = await documentClient.put(params).promise();
const response = {
statusCode: 200,
};
return response;
}
catch (e) {
return {
statusCode: 500,
body: JSON.stringify(e)
};
}
};
Run Code Online (Sandbox Code Playgroud)
我们需要使用update-item而不是put-item,如果记录不存在,两者都会创建一个记录。但是 update-item 接受UpdateExpression来帮助我们更新现有属性。
UpdateExpression: "SET visits = if_not_exists(visits, :initial) + :num"
if_not_existsinitial当属性visits不存在时,有助于第一次使用值。
docClient.update(
{
TableName: "ipAddress",
Key: {
ipAddress: ipAddress,
},
UpdateExpression: "SET visits = if_not_exists(visits, :initial) + :num",
ExpressionAttributeValues: {
":num": 1,
":initial": 0,
},
},
function (error, result) {
console.log("error", error, "result", result);
}
);
Run Code Online (Sandbox Code Playgroud)