2016-08-04 17 views
2

ich abgekocht habe das Internet, wie dies zu beheben, mit wenig Erfolg ...leerer String Validation Ausnahme - DynamoDB

ich eine CSV bin Parsen und die Daten in eine Tabelle setzen DynamoDB verwenden. Immer gibt es einen leeren Eintrag, ich die Fehlermeldung:

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

Zum Beispiel:

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

Das Problem ist, werde ich nie wissen, ob es Rohlinge sind oder nicht in der CSV. Aber ich muss es immer noch analysieren, auch wenn es da ist.

Ich habe versucht, den Wert der leeren Zeichenfolge etwas wie "N/A" zu vergeben, um diesen Fehler ohne Erfolg zu unterlaufen. Irgendwelche Vorschläge?

EDIT: Code zum Hinzufügen von Kontext.

+0

'Ich habe versucht, den Wert des leeren String etwas neu zu vergeben, wie„N/A“in dem Bemühen, diesen Fehler ohne Erfolg zu unterminieren. 'Vielleicht müssen Sie dann Ihren Code zeigen, denn das sollte gut funktionieren. Sie können das Attribut auch vollständig aus dem Put-Befehl entfernen, wenn die Zeichenfolge null ist. –

+0

Wie ist diese Frage kein Duplikat Ihrer vorherigen Frage? https: // Stapelüberlauf.com/questions/38751132/attribute-may-not-contain-eine-leere-string –

+0

Ich werde den Code in einer Bearbeitung hinzufügen. Zugegeben, die Fragen sind ähnlich, aber ich hatte viele verschiedene Probleme, die ich durch die letzte Frage gelöst habe. Das Problem ist meine Hauptfrage, wie man diesen spezifischen Fehler umgehen kann, der nie beantwortet wurde. Ich fühlte, dass dieser Beitrag prägnanter und viel klarer ist als mein letzter (der viele Probleme hatte). – FF5Ninja

Antwort

3

Nirgendwo in Ihrem Code ordnen Sie die Werte von Name, Alter usw. Ihrem params-Objekt zu. Zeigen Sie immer noch nicht den ganzen Code? Wenn Sie dies eine Minute lang ignorieren und Ihre Validierungsschleife betrachten, werfen Sie einfach den Wert "N/A" weg. Sie müssen das tatsächliche Objekt params ändern, das Sie zum Einfügen von Datensätzen verwenden. Ändern Sie die Validierungsschleife dazu:

//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"; 
     } 
    } 

Wahrscheinlich gibt es einen einfacheren Weg, dies zu tun, wie Sie die Werte von data und Kopieren nehmen, dass zum params Objekt, aber Sie nicht, dass Code zeigen zu sein scheinen.

+1

OK, der Fehler ist weg und die Daten machen, was ich brauche. Vielen Dank für Ihre Hilfe, und ich entschuldige mich, wenn ich diese Website missbraucht habe. Ich werde das nächste Mal in meinen Ticks bewusster sein. – FF5Ninja

0

Diese Funktionen funktionieren wie ein Charme, müssen nur storageSerialize auf Ihrem Objekt vor dem Speichern und storageDeserialize ausführen, wenn Sie ein Element erhalten.

Möglicherweise möchten Sie Ihr Objekt in den gleichen Zustand wie in der Eingabe erhalten.

Hinweis: Der Code oben in Typoskript ist, aber man kann es leicht

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

Bisher anzupassen, Mangel an Unterstützung für leere Strings in DynamoDB des DocumentClient ist immer noch eine Einschränkung. Sie sollten jedoch wissen, dass AWS SDK v2.7.16 seit Juli 2017 eine Konstruktoroption (convertEmptyValues) für document client hinzugefügt hat, um leere Zeichenfolgen, Mengen und Binärzeichenfolgen in ein typisiertes DynamoDB-Feld NULL zu konvertieren.

Wenn diese clientseitige Problemumgehung für Sie funktioniert, müssen Sie true festlegen, wenn der Dokumentclient leere Werte (Zeichenfolgen, binäre Puffer und Mengen der Länge 0) konvertieren soll NULL Typen, wenn in DynamoDB beibehalten wird.

Etwas wie folgt aus:

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

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