空字符串验证异常 - DynamoDB

问题描述 投票:0回答:6

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

我正在解析 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”之类的值,试图颠覆此错误,但无济于事。有什么建议吗?

编辑:添加上下文的代码。

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");
    });
javascript csv amazon-web-services amazon-dynamodb
6个回答
13
投票

到目前为止,DynamoDB 的 DocumentClient 中缺乏对空字符串的支持仍然是一个限制。但是,您应该知道,自 2017 年 7 月起,AWS SDK v2.7.16

document client
添加了构造函数选项(称为 convertEmptyValues),以将空字符串、集合和二进制字符串转换为 DynamoDB
NULL
类型字段.

如果此客户端解决方法适合您,并且希望文档客户端将空值(0 长度字符串、二进制缓冲区和集)转换为

,则需要设置为 
true
 NULL
持久化到 DynamoDB 时的类型。

类似这样的:

const AWS = require("aws-sdk");

const docClient = new AWS.DynamoDB.DocumentClient({
    convertEmptyValues: true
});

3
投票

代码中没有任何地方将姓名、年龄等值分配给 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
对象,但您似乎没有显示该代码。


1
投票

2020年5月18日更新:

DynamoDB 现在支持非键属性的空字符串值:https://aws.amazon.com/about-aws/whats-new/2020/05/amazon-dynamodb-now-supports-empty-values-for- dynamodb 表中的非键字符串和二进制属性/

写入 DynamoDB 时,您不应再看到此异常。


0
投票

这些函数就像一个魅力,只需在存储之前对对象执行 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;
}

0
投票

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


0
投票

添加此注释,因为它可能对其他使用partiQL或在参数中使用空字符串的人有帮助。

如果在where条件中传递空参数,错误仍然出现。例如,如果您在partiql中运行以下查询,您可以看到“ValidationException:一个或多个键属性值无效:键属性的AttributeValue不能包含空字符串值。”

SELECT  "mypartitionkey","my_sort_key","fullName" FROM "dynamodbtable"  WHERE "mypartitionkey"= 'profile' and my_sort_key in ('12345', '' )

但是如果你通过下面的 run 就会起作用

SELECT  "mypartitionkey","my_sort_key","fullName" FROM "dynamodbtable"  WHERE "mypartitionkey"= 'profile' and my_sort_key in ('12345' )
© www.soinside.com 2019 - 2024. All rights reserved.