无法使用 GSI 更新 DynamoDB 中的项目
Unable to update the item in DynamoDB using the GSI
我的 dynamodb table 中有以下结构:-
编号:partition_key
user_id:GSI
以下是我的 Lambda,我试图从用户对象中的客户端(在 JSON 中)获取 user_id 的值,并且然后尝试使用查询操作更新 Dynamodb 项目,但它不起作用:-
exports.lambdaHandler = async (event, context) => {
logger.info('event:', event);
let body, data;
let statusCode = 200;
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': '*'
};
const user = JSON.parse(event.body).user;
const updatedOn = new Date().getTime();
try {
const params = {
TableName: ddbTable,
IndexName: 'user_id-index',
KeyConditionExpression: 'user_id = :id',
ExpressionAttributeValues: {
':id': user.id
}
};
dynamodb.query(params, function (err, result) {
console.log("result", result);
data = result;
if (err) {
console.log("Unable to query item. Error JSON:", JSON.stringify(err));
} else {
const parameters = {
TableName: ddbTable,
Key: {
"id": result.Items[0].id
},
UpdateExpression: "set first_name = :f, last_name = :l, postal_code = :p, country_code = :c, updated_on = :u",
ExpressionAttributeValues: {
":f": user.firstName,
":l": user.lastName,
":p": user.postalCode,
":c": user.countryCode,
":u": updatedOn
},
ReturnValues: "UPDATED_NEW"
};
dynamodb.update(parameters, function (err, data) {
if (err) console.log(err);
else console.log(data);
});
}
});
console.log("*********");
} catch (err) {
console.log(err);
statusCode = 400;
body = err.message;
return err;
} finally {
body = JSON.stringify(data);
}
return {
statusCode,
body,
headers
};
};
查询操作根本不起作用。
此语句未被执行
dynamodb.query(params, function (err, result) {
求推荐。
在 Node.js Lambda 处理程序中有 two patterns to invoke asynchronous calls 例如 dynamodb.query
:async-await 或回调。因为您的处理程序没有正确实现,所以没有 SDK 调用的 Lambda returns 完成。
推荐的方法是 async-await。添加 await
关键字并使用 .promise()
承诺该方法。这种模式是首选,因为它消除了嵌套 SDK 调用的“回调地狱”。
const queryResult = await dynamodb.query(params).promise()
const updateParams = {
Key: { "id": queryResult.Items[0].id },
...
}
const updateResult = await dynamodb.update(updateParams).promise()
有关回调模式示例,请参阅来自 awsdocs 存储库的上述 link 或 this。
注:AWS SDK for JavaScript v3现已稳定,推荐版本。
我的 dynamodb table 中有以下结构:- 编号:partition_key user_id:GSI
以下是我的 Lambda,我试图从用户对象中的客户端(在 JSON 中)获取 user_id 的值,并且然后尝试使用查询操作更新 Dynamodb 项目,但它不起作用:-
exports.lambdaHandler = async (event, context) => {
logger.info('event:', event);
let body, data;
let statusCode = 200;
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': '*'
};
const user = JSON.parse(event.body).user;
const updatedOn = new Date().getTime();
try {
const params = {
TableName: ddbTable,
IndexName: 'user_id-index',
KeyConditionExpression: 'user_id = :id',
ExpressionAttributeValues: {
':id': user.id
}
};
dynamodb.query(params, function (err, result) {
console.log("result", result);
data = result;
if (err) {
console.log("Unable to query item. Error JSON:", JSON.stringify(err));
} else {
const parameters = {
TableName: ddbTable,
Key: {
"id": result.Items[0].id
},
UpdateExpression: "set first_name = :f, last_name = :l, postal_code = :p, country_code = :c, updated_on = :u",
ExpressionAttributeValues: {
":f": user.firstName,
":l": user.lastName,
":p": user.postalCode,
":c": user.countryCode,
":u": updatedOn
},
ReturnValues: "UPDATED_NEW"
};
dynamodb.update(parameters, function (err, data) {
if (err) console.log(err);
else console.log(data);
});
}
});
console.log("*********");
} catch (err) {
console.log(err);
statusCode = 400;
body = err.message;
return err;
} finally {
body = JSON.stringify(data);
}
return {
statusCode,
body,
headers
};
};
查询操作根本不起作用。 此语句未被执行
dynamodb.query(params, function (err, result) {
求推荐。
在 Node.js Lambda 处理程序中有 two patterns to invoke asynchronous calls 例如 dynamodb.query
:async-await 或回调。因为您的处理程序没有正确实现,所以没有 SDK 调用的 Lambda returns 完成。
推荐的方法是 async-await。添加 await
关键字并使用 .promise()
承诺该方法。这种模式是首选,因为它消除了嵌套 SDK 调用的“回调地狱”。
const queryResult = await dynamodb.query(params).promise()
const updateParams = {
Key: { "id": queryResult.Items[0].id },
...
}
const updateResult = await dynamodb.update(updateParams).promise()
有关回调模式示例,请参阅来自 awsdocs 存储库的上述 link 或 this。
注:AWS SDK for JavaScript v3现已稳定,推荐版本。