空字符串验证异常-DynamoDB

Empty String Validation Exception - DynamoDB

本文关键字:-DynamoDB 异常 验证 字符串      更新时间:2023-09-26

我在互联网上搜索了如何解决这个问题,但收效甚微。。。

我正在解析一个CSV,并使用DynamoDB将数据放入一个表中。任何时候有一个空白条目,我都会收到错误:

One or more parameter values were invalid: An AttributeValue may not contain an empty string

例如:

Header: "Name","Age","Birth date"
Entry:  Brandon,22  <------ THROWS ERROR

问题是,我永远不会知道CSV中是否有空格。但我仍然需要解析它,即使有。

我试图将空字符串的值重新分配给类似"N/A"的值,试图破坏这个错误,但没有成功。有什么建议吗?

EDIT:添加上下文的代码。

var file = process.argv[2];
console.log("File: " + file);
var csv = require("fast-csv");
csv.fromPath(file, {
        headers: true,
        ignoreEmpty: true
    })
    .on("data", function(data) {
        // Uncomment to see CSV data
        // console.log(data);
        params = {
            TableName: tableName,
            Item: {
                RefID: {
                    S: data["Ref-ID"]
                },
                //lots more items
            }
        };
        //Validation loops to make sure the items are defined
        for (var key in params.Item) {
            for (var items in params.Item[key]) {
                var value = params.Item[key][items];
                if (value === undefined || value === "") {
                    value = "N/A";
            }
        }
        dynamodb.putItem(params, function(err, info) {
            if (err) {
                console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
            }
            else {
                console.log("Added item:", JSON.stringify(data, null, 2));
            }
        });
        // }
    })
    .on("end", function() {
        console.log("done");
    });

到目前为止,DynamoDB的DocumentClient中缺乏对空字符串的支持仍然是一个限制。但是,您应该知道,自2017年7月以来,AWS SDK v2.7.16为文档客户端添加了一个构造函数选项(称为convertEmptyValues),用于将空字符串、集合和二进制字符串转换为DynamoDB NULL类型字段。

如果这种客户端解决方法适用于您,那么如果您希望文档客户端在持久化到DynamoDB时将要转换为NULL类型的空值(0长度字符串、二进制缓冲区和集)转换为CCD-3,则需要将其设置为true

类似这样的东西:

const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({
    convertEmptyValues: true
});

在代码的任何地方都不能将name、age等值分配到params对象中。你仍然没有显示所有的代码吗?暂时忽略这一点,看看你的验证循环,你就是在扔掉"N/a"值。您需要修改用于插入记录的实际params对象。将验证循环更改为:

    //Validation loops to make sure the items are defined
    for (var key in params.Item) {
        for (var items in params.Item[key]) {
            var value = params.Item[key][items];
            if (value === undefined || value === "") {
                params.Item[key][items] = "N/A";
        }
    }

可能有一种更简单的方法可以做到这一点,因为您从data中获取值并将其复制到params对象,但您似乎没有显示该代码。

2020年5月18日更新:

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/

在写入DynamoDB时,您不应该再看到此Exception。

这些函数的工作原理就像一个符咒,只需要在存储之前对对象执行storageSerialize,在获得项时执行storageDeserialize。

您可能希望使对象处于与输入中相同的状态。

注意:上面的代码是用Typescript编写的,但你可以很容易地将其改编为

private storageSerialize(data: any) {
    Object.keys(data).forEach(function (key) {
        let val = data[key];
        if (val == null) {
            data[key] = "PLACEHOLDER_NULL"
        }
        if (val == "") {
            data[key] = "PLACEHOLDER_EMPTYSTRING"
        }
    });
    return data;
}
private storageDeserialize(data: any) {
    if (data !== undefined) {
        Object.keys(data).forEach(function (key) {
            let val = data[key];
            if (val == "PLACEHOLDER_NULL") {
                data[key] = null
            }
            if (val == "PLACEHOLDER_EMPTYSTRING") {
                data[key] = ""
            }
        });
    }
    return data;
}

或者您可以传递nullify_invalid new Marshaler(['nullify_invalid'=>true]);