我遇到的问题是DynamoDB不能接受空字符串作为属性中的值。 我总是必须在前端检查是否存在空字符串值,否则API调用将因Dynamo DB将抛出的错误“AttributeValue可能不包含空字符串”而失败。
如果有一个递归函数可以删除根据DynamoDB无效的属性,以便DynamoDB中的putItem或更新请求能够正常工作,我就会徘徊。
答案 0 :(得分:13)
Jan 3 2017 Merge #1283上的最新更新通过将标记convertEmptyValues
放入客户端对象的选项字段中来更新AWS.DynamoDB.DocumentClient constructor-property以允许空值。
示例:
const DynamoDB = new AWS.DynamoDB.DocumentClient( {
convertEmptyValues: true
} );
值得关注的问题
答案 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,而不是空字符串。