2016-08-03 59 views
2

解析CSV文件并将数据放入AWS DynamoDB的表中。属性可能不包含空字符串

因为它现在代表,我收到以下错误:

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

...之前,把该表中的数据。数据已经上了桌子,但不会在发生这种错误一百万次的垃圾邮件之前。

我的代码:

var csv = require("fast-csv"); 

csv.fromPath(file, { 
     headers: true, 
     ignoreEmpty: true 
    }) 
    .on("data", function(data) { 

     for (var key in data) { 
      if (data.hasOwnProperty(key)) { 
       if (data[key] === "" || data[key] === undefined || data[key] === null) { 
        data[key] = "N/A"; 
       } 
      } 

      params = { 
       TableName: tableName, 
       Item: { 
        RefID: { 
         S: data["Ref-ID"] 
        }, 
        //lots of other data 
       } 
      }; 
      dynamodb.putItem(params, function(err, data) { 
       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"); 
    }); 

正如你所看到的,我将任何可能的空字符串== N/A在试图解决这个问题。有什么想法吗?

编辑:

这原来是undefined时,它应该显示它放在桌子上。

console.log("Added item:", JSON.stringify(data[key], null, 2)); 

编辑2:改变了这种代码...

dynamodb.putItem(params, function(err, data) 

...这样的:

dynamodb.putItem(params, function(err, info) 

我仍然得到了错误,但我现在正确显示表。

+0

该错误意味着您的某些数据不在您的表格中。如果发生该错误;这应该表示Item没有被插入。对于错误顺序的数据,你的意思是什么?除非您提供范围键,否则数据没有真正的顺序? – jacob

+0

啊,你对订单是正确的。忽略我说过(我编辑了它)。我现在主要关心的是这个错误,我似乎无法解决。我在得到所有错误之后测试表格,并且数据在那里。但似乎是在尝试了很多次之后。 – FF5Ninja

+0

您有可能在“data”上访问的某个字段实际上不存在?我发现你在迭代中占用空字符串;但它没有考虑预期关键名称中的潜在错字;或者如果密钥名称不存在? – jacob

回答

3

尝试在您的param.Item对象上进行字段验证以验证所有设置是否正确;并找到困扰你的控制台的错误领域。

var tableName = "wombat_habitats"; 

var data = { 
    "Ref-ID": "Charlie" 
}; 

params = { 
    TableName: tableName, 
    Item: { 
    RefID: { 
     S: data["Ref-ID"] 
    }, 
    SomethingElse: { 
     S: data["Bad-Key"] 
    } 
    //lots of other data 
    } 
}; 

for(var itemKey in params.Item) { 
    for(var itemAttr in params.Item[itemKey]) { 
    var value = params.Item[itemKey][itemAttr]; 
    if(value === undefined || value === "") { 
     console.log("item", itemKey, "of type", itemAttr, "is undefined!") 
    } 
    } 
} 
+0

这真的很有帮助,谢谢你! – FF5Ninja

1

看来dynamoDB在这个时候不允许空字符串。我无法理解为什么,但截至此日期,您不能存储“Key”的属性:“”。

请向亚马逊投诉。 key =“”和key = null是非常不同的用例,并且是必需的。

0

我不知道DynamoDB的业务需求是否允许空字符串,但是我通过将空字符串保存为空字符串来解决此问题,并在显示该信息之前删除客户端上的这些空格。并不理想,但它允许我支持空字符串。

相关问题