2016-08-04 97 views
2

我已經走遍瞭如何收效甚微解決這個互聯網...空字符串驗證異常 - 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空白或不。但即使存在,我仍然需要解析它。

我試圖重新分配空字符串的值爲「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"); 
    }); 
+0

'我試圖在努力這個錯誤顛覆無濟於事重新分配的空字符串類似「N/A」的價值。 '也許你需要顯示你的代碼,因爲這應該可以正常工作。如果字符串爲空,也可以從Put命令中完全刪除屬性。 –

+0

這個問題怎麼不是你以前的問題的重複? https://開頭計算器。com/questions/38751132/attribute-may-not-contains-an-empty-string –

+0

我將在編輯中添加代碼。無可否認,這些問題是相似的,但我通過最後一個問題解決了許多不同的問題。問題是我如何解決這個具體錯誤的主要問題從來沒有回答過。我覺得這篇文章比我最後一篇(有很多問題)更簡潔明瞭。 – FF5Ninja

回答

3

你的代碼中沒有任何地方將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對象,但你似乎並不被顯示,代碼更簡單的方法。

+1

好吧,錯誤消失了,數據正在做我所需要的。感謝您的幫助,如果我濫用本網站,我表示歉意。下次我在蜱中更有意爲之。 – FF5Ninja

0

這些函數就像一個魅力一樣,只需要在存儲和存儲之前執行storageSerialize,然後在獲取物品時進行反序列化。

您可能想讓對象處於與輸入相同的狀態。

注:上面的代碼是打字稿,但你可以輕鬆適應它

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; 
} 
1

到現在爲止,缺少對DynamoDB的DocumentClient空字符串的支持仍然是一個限制。但是,您應該知道自2017年7月起,AWS SDK v2.7.16document client添加了構造函數選項(稱爲convertEmptyValues),以將空字符串,集合和二進制字符串轉換爲DynamoDB NULL類型的字段。

如果此客戶端解決方法適合您,則需要設置爲true,如果您希望文檔客戶端將空值(0長度字符串,二進制緩衝區和集合)轉換爲NULL類型時堅持到DynamoDB。

事情是這樣的:

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

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