【发布时间】:2020-04-25 23:33:36
【问题描述】:
我的 DynamoDB 中有一个名为 JuridicalPerson 的表
var params = {
AttributeDefinitions: [{
AttributeName: 'code',
AttributeType: 'S'
}],
KeySchema: [{
AttributeName: 'code',
KeyType: 'HASH'
}],
ProvisionedThroughput: {
ReadCapacityUnits: 5,
WriteCapacityUnits: 5
},
TableName: 'JuridicalPerson'
}
我可以在那里保存项目,但我无法更新这些项目。
我的 JuridicalPerson 表中的项目示例
{
"code": {
"S": "jp_rJaHvVrzf"
},
"status": {
"S": "pending"
}
}
更新表达式
function updateDynamoDB (payload) {
const adhesionUpdate = Object.assign({}, payload)
return new Promise((resolve, reject) => {
const params = {
TableName: 'JuridicalPerson',
Key: {
'code': {
'S': adhesionUpdate.code
}
},
UpdateExpression: 'SET #status = :val1',
ExpressionAttributeNames: {
'#status': 'status'
},
ExpressionAttributeValues: {
':val1': { 'S': adhesionUpdate.status }
},
ReturnValues: 'ALL_NEW'
}
return dynamoAdapter.getState().update(params, (err, items) => {
if (err) {
return reject(err)
}
return resolve(items)
})
})
}
如果我在更新之前放一个console.log 只是为了看到params,我们有
params: { TableName: 'JuridicalPerson',
Key: { code: { S: 'jp_rJaHvVrzf' } },
UpdateExpression: 'set #status = :val1',
ExpressionAttributeNames: { '#status': 'status' },
ExpressionAttributeValues: { ':val1': { S: 'active' } },
ReturnValues: 'ALL_NEW' }
但我收到以下错误
err: { ValidationException: Invalid attribute value type
message: 'Invalid attribute value type',
code: 'ValidationException',
time: 2017-12-18T12:40:39.488Z,
requestId: 'bc23aab1-d9a5-426f-a1af-3ff558e7e0fa',
statusCode: 400,
retryable: false,
retryDelay: 41.054909592801195 }
【问题讨论】:
-
我看不到任何明显的错误,除非
status被定义为任何二级索引中的键,如果是字符串以外的任何其他数据类型? -
我知道 DynamoDB 和 Document Client API 文档有时有点模棱两可,因为有时值应该不在
{S: 'some value'}形式中描述,而简单地描述为'some value'。然而,文档确实明确指出ExpressionAttributeValues应该采用更详细的形式,但如果我是你,我会尝试不使用{S: ...}。就我个人而言,自 DocumentClient API 发布以来,我一直只使用它,主要是为了摆脱所有这些S:和N:令人难以置信的冗长语法... -
一件小事。最后你的条件不应该有一个'else'(作为返回一个错误否则结果)。另外,我不是 javascript 程序员,但里面有很多 return 语句,很难看到代码的流程。您确定正在执行哪个代码?除此之外,我在实际的 DynamoDB 部件中根本没有发现任何问题。