【问题标题】:UpdateItem in DynamoDB error ValidationException: Invalid attribute value typeDynamoDB 中的 UpdateItem 错误 ValidationException:属性值类型无效
【发布时间】: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 部件中根本没有发现任何问题。

标签: node.js amazon-dynamodb


【解决方案1】:

在使用 DynamoDb 客户端而不是 DynamoDb 资源时,我收到了同样的模棱两可的错误消息。

DDB 客户端接受短格式 key: value 的值定义,而不是 DDB 资源 key: {'S': value} 接受的显式类型格式。

在您的示例中尝试使用:

const params = {
  TableName: 'JuridicalPerson',
  Key: {
    'code': adhesionUpdate.code
  },
  UpdateExpression: 'SET #status = :val1',
  ExpressionAttributeNames: {
    '#status': 'status'
  },
  ExpressionAttributeValues: {
    ':val1': adhesionUpdate.status
  },
  ReturnValues: 'ALL_NEW'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多