2016-08-03 72 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的業務需求是否允許空字符串,但是我通過將空字符串保存爲空字符串來解決此問題,並在顯示該信息之前刪除客戶端上的這些空格。並不理想,但它允許我支持空字符串。

相關問題