2016-08-03 23 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にすべての可能な空の文字列を変換しています。何かご意見は?

EDIT:

これは、それがテーブルに置くものを表示する必要があるときundefinedであることが判明しました。

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

EDIT 2:このコード変更...これまで

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

...:

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

私はまだエラーを取得していますが、正しくテーブルを表示しています。

+0

このエラーは、一部のデータがテーブルにないことを意味します。そのエラーが発生した場合。 Itemが挿入されなかったことを意味するはずです。そして、データが間違った順序であることはどういう意味ですか?範囲キーを指定しない限り、データに実際の順序はありませんか? – jacob

+0

ああ、あなたは正しいのですか?私はそれを言ったことを無視する(私はそれを編集した)。今私の主な懸念は、私が修正することができないこのエラーです。私はすべてのエラーを取得した後、テーブルをテストし、データがそこにあります。しかし、それは何度も何度も試みた後のように見えます。 – FF5Ninja

+0

'data'にアクセスするフィールドの1つが実際に存在しない可能性はありますか?私はあなたの反復で空の文字列を考慮しているのを見ます。それは予想されるキー名の潜在的なタイプミスを説明しません。またはキー名が単に存在しない場合は? – 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のビジネス要件はわかりませんが、この情報を表示する前にスペースを空にして文字列を保存してこの問題を回避しました。理想的ではありませんが、空の文字列をサポートすることができます。

関連する問題