简体   繁体   中英

ValidationException: The provided key element does not match the schema with primary key and sort key

Using "aws-sdk": "^2.1063.0" and nodejs 12

Inside my lambda I am doing an update to a dynamodb table.

My table has a Primary key: JobUID type string and a Sort key type string.

来自亚马逊

My parameters look like this:

    var params = {
      TableName: tableName,
      Key: {
        "JobUID": payload.JobUID,
        "TimeStamp": payload.TimeStamp
      },
      UpdateExpression:
        "set #HasResponse = :v_HasResponse, #ResponseTimeStamp = :v_ResponseTimeStamp, #Recommendation = :v_Recommendation, #ThreadRepComment = :v_ThreadRepComment",
      ExpressionAttributeNames: {
        "#HasResponse": payload.HasResponse,
        "#ResponseTimeStamp": payload.ResponseTimeStamp,
        "#Recommendation": payload.Recommendation,
        "#ThreadRepComment": payload.ThreadRepComment,
      },
      ExpressionAttributeValues: {
        ":v_HasResponse": payload.HasResponse,
        ":v_ResponseTimeStamp": payload.ResponseTimeStamp,
        ":v_Recommendation": payload.Recommendation,
        ":v_ThreadRepComment": payload.ThreadRepComment,
      },
      // returns only the affected attributes, as they appeared after the update
      ReturnValues: "UPDATED_NEW"
    };

I have printed out the payload.JobUID and payload.TimeStamp in the log so I know they are what expect.

The latest row in the table has JobUID and TimeStamp exactly as I printed them out. I want to update the 4 properties in the expression attribute names.

I am getting the error "ValidationException: The provided key element does not match the schema"

I have looked on the web and in SOF at examples of updates and I cannot seem to get this to work.

what is wrong with my key values.

The update call looks like this. Super simple

var returnValue = await dynamo.update(params).promise();

I also tried


Key: {
  JobUID: {"S": payload.JobUID},
  TimeStamp: {"S":payload.TimeStamp}
},

So this is what I found works:

 var params = {
      TableName: tableName,
      Key: {
        JobUID: payload.JobUID,
        TimeStamp: payload.TimeStamp
      },
      UpdateExpression:
        "set HasResponse = :v_HasResponse, ResponseTimeStamp = :v_ResponseTimeStamp, Recommendation = :v_Recommendation, ThreadRepComment = :v_ThreadRepComment",
      ExpressionAttributeValues: {
        ":v_HasResponse": payload.HasResponse,
        ":v_ResponseTimeStamp": payload.ResponseTimeStamp,
        ":v_Recommendation": payload.Recommendation,
        ":v_ThreadRepComment": payload.ThreadRepComment || "",
      },
      // returns only the affected attributes, as they appeared after the update
      ReturnValues: "UPDATED_NEW"
    };

    var returnValue = await dynamo.update(params).promise();

If there is a property is is null or empty, in my case the ThreadRepComment could be null or empty so you need to handle that.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM