2016-08-04 7 views
2
私はほとんど成功してこの問題を解決する方法について、インターネットを精練している

...空の文字列検証例外 - DynamoDBの

私はCSVを解析し、DynamoDBのを使用してテーブルにデータを入れています。 CSVでの空白かがある場合、私が知っていることはありません

Header: "Name","Age","Birth date" 
Entry: Brandon,22 <------ THROWS ERROR 

問題がされています。たとえば

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

: はいつでも、私はエラーを受け取り、空白のエントリがあります。しかし、私はまだそれがある場合でもそれを解析する必要があります。

私は空の文字列の値を "N/A"のようなものに再割り当てしようとしましたが、このエラーを無駄にすることはありません。助言がありますか?

EDIT:コンテキストを追加するコード。

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」のようなものに空の文字列の値を再割り当てすることを試みてきました。 'おそらくコードを表示する必要があるかもしれません。うまくいくはずですから。文字列がnullの場合は、Putコマンドから属性を完全に削除することもできます。 –

+0

この質問は以前の質問の重複ではありません。 https:// stackoverflow。com/questions/38751132 /属性に含まれない空文字列 –

+0

編集にコードを追加します。確かに、質問は似ていますが、私は最後の質問を通して解決した多くの異なる問題がありました。問題は、この特定のエラーを回避する方法の私の主な質問は決して答えられていないです。私はこのポストが私の最後のもの(多くの問題があった)よりも簡潔ではっきりしていると感じました。 – FF5Ninja

答えて

3

名前、年齢などの値を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

OK、エラーはなくなり、データは必要な処理を行っています。ご協力いただきありがとうございます。私がこのウェブサイトを悪用した場合はお詫び申し上げます。私は次の時間に私のダニでより意図的になります。 – FF5Ninja

0

これらの関数は魅力的に機能し、オブジェクトを格納する前にstorageSerializeを実行し、アイテムを取得するとstorageDeserializeを実行する必要があります。

オブジェクトを入力と同じ状態にしたい場合があります。

注:上記のコードは活字体である、しかし、あなたは簡単に今まで

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で空の文字列のサポートの欠如は、まだ制限です。ただし、AWS SDK v2.7.16には、空の文字列、セット、およびバイナリ文字列をNULL型フィールドに変換するためのdocument clientのコンストラクタオプション(convertEmptyValues)が追加されました。

このクライアント側の回避策は、あなたのために働く場合は、空の値(0長文字列、バイナリバッファ、およびセット)に変換されるように変換するには、ドキュメントのクライアントをご希望の場合は、trueに設定する必要がありますNULLは、DynamoDBを永続化するときにタイプします。このような

何かを:

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

const docClient = new AWS.DynamoDB.DocumentClient({ 
    convertEmptyValues: true 
}); 
関連する問題