Node.js调用DynamoDB list_append遇ValidationException求助
问题排查:DynamoDB更新时出现ValidationException错误
表结构
{ "phone": "01131845602", // 分区键(primary key) "customerId": "47E1395C-08DD-E6B1-EEF9", // 排序键(sort key) "consultations": [ { "consultId": "BE9320FB-7635-499E-83A2", "header": "asdfadfadsfasdfa", "body": [ "asdfasdfasdf", "asdfasdfasdf" ], "footer": { "consentButtonText": "afadsfasdfas", "consentText": "asdfasdfasdfasdfasdfasdfasdf", "isCheckbox": true } } ] }
需求
向表中指定项的consultations字段添加以下新的咨询对象:
{ "consultId": "BE9320FB-7635-499E-83A3", "header": "asdfadfadsfasdfa", "body": [ "asdfasdfasdf", "asdfasdfasdf" ], "footer": { "consentButtonText": "afadsfasdfas", "consentText": "asdfasdfasdfasdfasdfasdfasdf", "isCheckbox": true } }
错误信息
执行更新时抛出如下异常:
ValidationException: The provided key element does not match the schema ... code: 'ValidationException', time: ... requestId: '....', statusCode: 400, retryable: false, retryDelay: 30.830076736357114
当前更新代码
try { params = { TableName: tablename, Key: { phone: phone }, UpdateExpression: "SET #co = list_append(#co, :data)", ExpressionAttributeNames: { '#co': 'consultations' }, ExpressionAttributeValues: { ':data': [data] }, ReturnValues: "ALL_NEW" }; const result = await this.awsDynamoDb.update(params); console.log("result => ", result); } catch (error) { console.log("error updating -> ", error); }
预期更新结果
{ "phone": "01131845602", "customerId": "47E1395C-08DD-E6B1-EEF9", "consultations": [ { "consultId": "BE9320FB-7635-499E-83A2", "header": "asdfadfadsfasdfa", "body": [ "asdfasdfasdf", "asdfasdfasdf" ], "footer": { "consentButtonText": "afadsfasdfas", "consentText": "asdfasdfasdfasdfasdfasdfasdf", "isCheckbox": true } }, { "consultId": "BE9320FB-7635-499E-83A3", "header": "asdfadfadsfasdfa", "body": [ "asdfasdfasdf", "asdfasdfasdf" ], "footer": { "consentButtonText": "afadsfasdfas", "consentText": "asdfasdfasdfasdfasdfasdfasdf", "isCheckbox": true } } ] }
问题原因及解决方法
问题根源
你的表使用复合主键:phone是分区键(Partition Key),customerId是排序键(Sort Key)。DynamoDB要求更新操作必须提供完整的主键(分区键+排序键)才能定位到唯一条目,但你当前的Key参数只传入了phone,缺少customerId,因此抛出"key element does not match the schema"的验证错误。
修正后的代码
在Key中补充customerId参数即可:
try { params = { TableName: tablename, Key: { phone: phone, customerId: customerId // 补充排序键 }, UpdateExpression: "SET #co = list_append(#co, :data)", ExpressionAttributeNames: { '#co': 'consultations' }, ExpressionAttributeValues: { ':data': [data] }, ReturnValues: "ALL_NEW" }; const result = await this.awsDynamoDb.update(params); console.log("result => ", result); } catch (error) { console.log("error updating -> ", error); }
额外说明
- 确保
customerId变量的值与目标条目中的customerId完全一致; list_append的用法正确,:data用数组包裹新对象是正确的,因为list_append要求两个参数都是列表。
内容的提问来源于stack exchange,提问作者Anik Kumar Sarker
相关产品推荐
相关产品推荐

