DynamoDB更新操作中的ConditionExpression出现未知错误



我正在遍历DynamoDB表中的许多项,如果该项包含某个字段(它是一个对象(,我想在该字段上设置对象的一些属性。

我尝试了两种代码变体,但它们都给了我以下未指明的错误

{
"errorType": "ConditionalCheckFailedException",
"errorMessage": "The conditional request failed",
"code": "ConditionalCheckFailedException",
"message": "The conditional request failed",
"time": "2020-08-29T11:44:11.703Z",
"requestId": "IAN8A31FN2F1HR0ORT1RMTH5ENVV4KQNSO5AEMVJF66Q9ASUAAJG",
"statusCode": 400,
"retryable": false,
"retryDelay": 26.45456917481479,
"stack": [
"ConditionalCheckFailedException: The conditional request failed",
"    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:51:27)",
"    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
"    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
"    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)",
"    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
"    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
"    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10",
"    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
"    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12)",
"    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"
]
}

这是具有命名属性的代码


const itemParams = {
TableName: process.env.vehiclesTableName,
Key: { vehicleId },
UpdateExpression:
'set #learned.#versionId = :versionId, #learned.#fileFormat = :fileFormat',
ExpressionAttributeValues: {
':versionId': VersionId,
':fileFormat': fileFormat,
},
ConditionExpression: 'attribute_exists(#learned)',
ExpressionAttributeNames: {
'#learned': 'learned',
'#versionId': 'versionId',
'#fileFormat': 'fileFormat',
},
}
await db.update(itemParams).promise()

并且没有命名属性

const itemParams = {
TableName: process.env.vehiclesTableName,
Key: { vehicleId },
UpdateExpression:
'set learned.versionId = :versionId, learned.fileFormat = :fileFormat',
ExpressionAttributeValues: {
':versionId': VersionId,
':fileFormat': fileFormat,
},
ConditionExpression: 'attribute_exists(learned)',
}
await db.update(itemParams).promise()

他们俩的行为都一样。

您看到的异常实际上是预期的行为,表明该条件没有计算为true。来自文件:

条件检查失败异常

消息:条件请求失败

您指定了一个计算结果为false的条件。例如,您可能尝试对项执行条件更新,但该属性的实际值与条件中的预期值不匹配。

当您得到ConditionalCheckFailedException异常时,您显然正在尝试更新一个没有learned属性的项。

最新更新