Javascript 空字符串验证异常-DynamoDB

Javascript 空字符串验证异常-DynamoDB,javascript,csv,amazon-web-services,amazon-dynamodb,Javascript,Csv,Amazon Web Services,Amazon Dynamodb,我在互联网上搜索了一下如何解决这个问题,但收效甚微 我正在解析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,并使用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

您的代码中没有任何地方将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";
        }
    }

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

这些函数工作起来很有魅力,只需在对象上执行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;
}

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

如果此客户端解决方案适合您,则如果希望文档客户端在持久化到DynamoDB时将空值(0长度字符串、二进制缓冲区和集合)转换为
NULL
类型,则需要将其设置为
true

大概是这样的:

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

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

或者您可以传递nullify_invalid new封送拆收器(['nullify_invalid'=>true])

2020年5月18日更新:

DynamoDB现在支持非键属性的空字符串值:


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

我尝试将空字符串的值重新分配给类似“N/A”的值,试图破坏此错误,但没有效果也许您需要显示您的代码,因为这样应该可以正常工作。另外,如果字符串为null,您可以完全从Put命令中删除该属性。诚然,问题是相似的,但我有许多不同的问题,我通过最后一个问题解决了。问题是我的主要问题是如何避开这个特定的错误,这个问题一直没有得到回答。我觉得这篇文章比我上一篇(有很多问题)更简洁、更清晰。你需要展示更多的代码。分配了某个值后,您对该值做了什么?看起来您只是在循环遍历这些值,将每个值分配给
value
,然后将其扔掉……而且这看起来与您之前提出的问题完全相同,这是一个关于如何处理相同错误消息的问题。如果你还没有真正的答案,你就不应该把最后一个问题标记为已回答。我的印象是,如果有人帮你解决问题或给你最好的答案,你会给他们打勾。虽然我的问题还没有完全解决,但他帮助我解决了代码中的其他问题,让我更好地理解了正在发生的事情。如果我错了,我不会让它再次发生。好的,错误消失了,数据正在做我需要的事情。谢谢你的帮助,如果我误用了这个网站,我向你道歉。下一次我会更加有意。截至2020年6月,DynamoDB现在支持非关键属性的空字符串值:@Aaron_H:如果我读对了公告,这只适用于Amazon DynamoDB local(即可下载版本的DynamoDB),而不适用于DynamoDB web服务。
const AWS = require("aws-sdk");

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