2016-07-05 11 views
1

Ich habe Probleme mit einem Loopback-Problem mit Ajax. Ich versuche, ein Array von Objekten durch jQuery-Funktion .ajax() POST, aber ich kann einfach nicht. Der Server schickt mir immer einen 422 Fehler (Unprocessable Entity).Loopback: POST ein Array von Objekten durch Ajax

Das Kuriose ist: Ich bin in der Lage, genau die gleiche Anfrage mit dem GUI-Explorer oder der Befehlszeile zu tun.

Ich habe zwei Modelle: Nemo & PendingUpdates verbunden sind durch eine hadMany/belongsTo Verhältnis (ich habe abgeschnitten sie besser lesbar sein):

// nemo.json 
{ 
    "name": "Nemo", 
    "base": "PersistedModel", 
    "properties": { 
    "id": { 
     "type": "Number", 
     "id": true, 
     "required": false, 
     "generated": true 
    } 
    }, 
    "relations": { 
    "pendingUpdates": { 
     "type": "hasMany", 
     "model": "PendingUpdate", 
     "foreignKey": "nId" 
    } 
    } 
} 

und

// pending-update.json 
{ 
    "name": "PendingUpdate", 
    "base": "PersistedModel", 
    "properties": { 
    "id": { 
     "type": "Number", 
     "id": true, 
     "required": false, 
     "generated": true 
    }, 
    "nId": { 
     "type": "Number", 
     "required": true 
    }, 
    "parameter": { 
     "type": "String", 
     "required": false 
    }, 
    "requestType": { 
     "type": "Number", 
     "required": true 
    } 
    }, 
    "relations": { 
    "nemo": { 
     "type": "belongsTo", 
     "model": "Nemo", 
     "foreignKey": "nId" 
    } 
    } 
} 

Hier ist das Ding: Ich versuche, ein Array von pendingUpdates zu senden. Mit dem Strongloop Explorer, ich nur POST dies: auf /Nemos/{id}/pendingUpdates mit ID: 2 und Daten: [{"requestType": 3, "parameter": "stuff"}, {"requestType": 2, "parameter": "otherStuff"}]. Ich habe einen 200 Antwortcode mit den erstellten Objekten im Körper.

aber wenn ich versuche, die genau die gleiche Anfrage Client-Seite mit jQuery zu schicken, ich 422.

bekam Hier ist der Code-Schnipsel:

var data = [ 
      {"requestType": 3, "parameter": "stuff"}, 
      {"requestType": 2, "parameter": "otherStuff"} 
     ]; 
$.ajax("/api/Nemos/2/pendingUpdates?access_token=xxxxxxxxx", { 
     data: data, 
     headers: { 
      Accept: "application/json", 
      contentType: "application/json" 
     }, 
     method: "POST" 
    }).done(success) 
    .fail(fail); 

Ich habe versucht, direkt data verwenden, mit {data} , , ...

Könnte mir jemand helfen?

Vielen Dank,

Bjorge

+0

Es scheint, dass jQuery hat ein seltsames Verhalten mit Arrays in seiner '.ajax()' -Funktion: > * Daten: * Es wird in eine Abfrage Zeichenfolge umgewandelt, wenn nicht bereits eine Zeichenfolge. Es wird an die URL für GET-Anfragen angehängt. Siehe "processData" -Option, um diese automatische Verarbeitung zu verhindern. Objekt muss Schlüssel/Wert-Paare sein. ** Wenn value ein Array ist, serialisiert jQuery mehrere Werte mit demselben Schlüssel ** basierend auf dem Wert der Einstellung "traditio- nal" (siehe unten).< Jemand weiß, wie man das verhindert? Ich habe versucht, das 'traditionelle' Attribut sowohl mit' true' als auch 'false' Attributen zu verwenden und nichts hat sich geändert. – bjorge

Antwort

1

Ok, nach einem Tag der Dinge mit der Konsole und versucht Wireshark, habe ich festgestellt, was falsch war; Ich werde die Antwort hier aufschreiben, um zukünftigen Menschen mit dem gleichen Problem zu helfen.

  • Erstens, wie ich in meinem Kommentar angenommen, haben die Probleme nicht aus LoopBack kommen, die die Daten falsch interpretieren würde es geschickt, aber von jQuery: die POST Anfrage gesendet wurde, aber ohne Daten.
  • Dann konnte ich eine ordnungsgemäße POST Anfrage senden (dh mit einem JSON-Objekt, kein Array). Ich konnte sehen, dass es zwei Content-Type Header gab. Ich habe meine Funktion geändert, um nur eine zu senden.
  • Schließlich konnte ich die Anfrage korrekt mit dem folgenden Code ausführen lassen:

.

var data = [ 
      {"requestType": 3, "parameter": "stuff"}, 
      {"requestType": 2, "parameter": "otherStuff"} 
     ]; 
$.ajax("/api/Nemos/2/pendingUpdates?access_token=xxxxxxxxx"), { 
     data: JSON.stringify(data), 
     accept: "application/json", 
     contentType: "application/json", 
     method: "POST" 
    }).done(success) 
    .fail(fail); 

Ich hoffe, es wird jemandem in der Zukunft helfen.