带DynamoDB的NodeJS抛出错误“AttributeValue可能不包含空字符串”

时间:2016-05-27 09:17:33

标签: javascript node.js amazon-web-services amazon-dynamodb

我遇到的问题是DynamoDB不能接受空字符串作为属性中的值。 我总是必须在前端检查是否存在空字符串值,否则API调用将因Dynamo DB将抛出的错误“AttributeValue可能不包含空字符串”而失败。

如果有一个递归函数可以删除根据DynamoDB无效的属性,以便DynamoDB中的putItem或更新请求能够正常工作,我就会徘徊。

4 个答案:

答案 0 :(得分:13)

答案 1 :(得分:0)

解决方案是创建一个递归函数,根据DynamoDB检查返回它的对象中的每个属性,而不使用那些无效的属性值。

function clean(obj) {
    return function remove(current) {
        _.each(current, function(value, key) {
            if (_.isUndefined(value) || _.isNull(value) || _.isNaN(value) ||
                (_.isString(value) && _.isEmpty(value)) ||
                (_.isObject(value) && _.isEmpty(remove(value)))) {

                delete current[key];
            }
        });
        if (_.isArray(current)) _.without(current, undefined);
        return current;
    }(_.clone(obj));
}

答案 2 :(得分:0)

没有值时,您不保留文档属性。 这是我使用PutItem处理可选属性的空字符串值的方法。

user: {
  Username: 'jdoe',
  Name: 'John Doe',
  Description: 'Fake user'
}

如果该值不为空,请更新该值,否则请删除该属性:

  const params = {
    Key: {
      Username: {
        S: user.Username
      }
    },
    AttributeUpdates: {},
    TableName: 'Users',
  };

  if (user.hasOwnProperty('Description')) {
    params.AttributeUpdates.Description = (user.Description === '')
    ? { Action: 'DELETE' }
    : { Action: 'PUT', Value: { S: user.Description } };
  }

  return db.updateItem(params)
    .promise()

在dynamoDB中:

user: {
  Username: 'jdoe',
  Name: 'John Doe'
}

答案 3 :(得分:0)

2020年6月更新:

DynamoDB现在为非关键属性支持空字符串值:https://aws.amazon.com/about-aws/whats-new/2020/05/amazon-dynamodb-now-supports-empty-values-for-non-key-string-and-binary-attributes-in-dynamodb-tables/

为了具有一致的行为,请确保客户端没有{ convertEmptyValues: true },否则这些属性将被保存为NULL,而不是空字符串。