2016-05-24 14 views
0

Ich bin Entsendung einer ausdrücklichen App wie folgt analysieren:Wie Datenobjekt in Express von Ajax POST

$.ajax 
    type: "POST" 
    url: localUrl 
    data: data 
    cache: false 
    dataType: 'native' 
    xhrFields: 
     responseType: 'blob' 

Und das ist, was die data wie folgt aussieht:

data = 
    'options': 
     'format': 'Letter'  
     'border': 
      'top': '2in' 
      'right': '1in' 
      'bottom': '2in' 
      'left': '1.5i' 
     'header': 
      'height': '45mm' 
      'contents': header 

Als ich die req.body im Express App einzuloggen, sieht die Ergebnisse wie folgt aus:

{ 
    'options[format]': 'Letter', 
    'options[border][top]': '2in', 
    'options[border][right]': '1in', 
    'options[border][bottom]': '2in', 
    'options[border][left]': '1.5i', 
    'options[header][height]': '45mm', 
    'options[header][contents]': '<div class="pdf-header">\n\tChart generated by http://collab.craft.dev\n</div>', 
    'options[footer][height]': '28mm', 
    'options[footer][contents]': '<div class="pdf-footer">\n\tTue May 24 2016 10:32:36 GMT+0100 (BST)\n</div>' 
} 

das bedeutet, dass ich nicht in der Lage bin B. auf die border.top-Eigenschaft unter Verwendung von req.body.options.border.top zuzugreifen.

Was passiert hier und wie kann ich sicherstellen, dass die Objektstruktur beibehalten wird?

Vielen Dank!

+0

'req.body.options.border.top' wird nicht funktionieren? –

+0

Leider nicht. Ich denke, weil die Objektstruktur in das oben ausgedruckte Format komprimiert ist. Ich merkte, dass ich es falsch eingegeben hatte. Jetzt bearbeitet. – bravokiloecho

Antwort

1

Sie müssen "extended syntax" aktivieren:

app.use(bodyParser.urlencoded({ extended : true })); 
+0

Perfekt, danke! Gibt es einen Grund, warum das normalerweise falsch ist? – bravokiloecho

+0

@bravokiloecho Die Dokumentation besagt, dass der Standardwert "wahr" ist. Vielleicht verwenden Sie eine ältere Version? – robertklep

1

Erste - How to retrieve POST query parameters in Expres s

Zweitens wollen wir eine Methode für Struktur Validierung einführen

function isValid(o, validStructure) { 
    return Object.keys(validStructure).every(function(key) { 
    if (Object.prototype.toString.call(validStructure[key]) === '[object Object]') { 
     return isValid(o[key], validStructure[key]) 
    } else { 
     return Object.prototype.toString.call(validStructure[key]) === Object.prototype.toString.call(o[key]) 
    } 
    }) 
} 

Danach können Sie empfangene Objekt vergleichen mit dem perfekten, so;

var expetedStructure = { 
    a: {}, 
    b: 'String', 
    c: [], 
    d: 1, 
    e: { 
    f: 'a' 
    } 
} 

if(isValid(requestObj, expectedStructure)) { 
    // suport it as requested object has valid structure 
} else { 
    // support validation error 
}