无法使用 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现已稳定,推荐版本。