2016-05-31 4 views
1

Ich versuche, ein Array von Objekten unter Verwendung eines regulären Formulars ohne AJAX einzureichen, und stelle fest, dass statt des Anfragekörpers, der in ein Array von Objekten geparst wird, nur viele Felder den Namen der Objekte entsprechen.In Express, ist es möglich, ein Array von Objekten ohne AJAX POST?

Ich weiß, dass wenn Sie ein Array von Primitiven übergeben, füllen Sie einfach viele Eingaben mit dem gleichen Namen und es wird gefüllt; Ich kann jedoch nicht meinen Kopf darauf legen, das auf komplexe Objekte anzuwenden.

Meine Form Code ist recht einfach:

<div class="col-sm-9"> 
    <div class="row"> 
     <div class="col-md-6"> 
      <div class="form"> 
       <div class="form-group"> 
        <label for="attachment[0].name" class="control-label">Name</label> 
        <input name="attachment[0].name" class="form-control" value="First Name" type="text"> 
       </div> 
       <div class="form-group"> 
        <label for="attachment[0].uri" class="control-label">URI</label> 
        <input name="attachment[0].uri" class="form-control" value="First URI" type="text"> 
       </div> 
       <div class="form-group"> 
        <label for="attachment[0].description" class="control-label">Description</label> 
        <textarea rows="4" value="First Description" name="attachment[0].description" class="form-control">First Description</textarea> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="col-md-6"> 
      <div class="form"> 
       <div class="form-group"> 
        <label for="attachment[1].name" class="control-label" >Name</label> 
        <input name="attachment[1].name" class="form-control" value="Second Name" type="text"> 
       </div> 
       <div class="form-group"> 
        <label for="attachment[1].uri" class="control-label">URI</label> 
        <input name="attachment[1].uri" class="form-control" value="Second URI" type="text"> 
       </div> 
       <div class="form-group"> 
        <label for="attachment[1].description" class="control-label">Description</label> 
        <textarea rows="4" name="attachment[1].description" class="form-control">Second Description</textarea> 
       </div> 
      </div> 
     </div> 
    </div> 

ich ein Beispiel-Repository gemacht haben mein Problem demonstriert; https://github.com/xueye/express-form-issue, wo Sie einfach node server.js ausführen können, navigieren Sie zu http://localhost:3000 und reichen Sie den Eintrag ein; die Anforderung Körper in der Konsole angezeigt werden, wo es als auftauchen sollte:

{ name: '', 
    type: '', 
    'attachment[0].name': 'First Name', 
    'attachment[0].uri': 'First URI', 
    'attachment[0].description': 'First Description', 
    'attachment[1].name': 'Second Name', 
    'attachment[1].uri': 'Second URI', 
    'attachment[1].description': 'Second Description' } 

Ist es möglich, POST-Daten in der Art, wie ich zu bin versucht?

Antwort

3

Wenn Sie eine POST-Anfrage mit einem normalen Formular oder mit JavaScript senden, senden Sie formatierten Text an den Server.

Sie können kein Array senden, aber Sie können eine Textdarstellung eines Arrays senden.

Keiner der the data formats supported by forms kommt mit einer Standardmethode, um ein Array von Daten darzustellen.

Ein Muster (eingeführt von PHP) verwendet eckige Klammern, um Array-ähnliche Strukturen zu beschreiben.

Dies ähnelt dem, was Sie verwenden, außer dass Sie manchmal die Punktnotation im JavaScript-Stil verwenden. Wechseln Sie zu rein mit eckigen Klammern.

name="attachment[1][uri]" 

... aber Sie müssen dieses Datenformat auf dem Server dekodieren.

Um das zu tun in Express 4 verwenden:

var bodyParser = require("body-parser"); 
var phpStyleParser = bodyParser.urlencoded({ extended: true }) 

und

app.post('/example', phpStyleParser, function(req, res) { 
    console.log(req.body); 
    res.json(req.body); 
}); 
+0

ich den erweiterten Teil fehlte, und die eckigen Klammern. Das macht Sinn - ich dachte immer, dass Anhang [Index] standardisiert war, aber anscheinend nicht! –

+0

in PHP verwende ich so: 'name =" attachment [] [uri] "' (ohne Indexnummer im Array) und dies funktioniert nicht in Express! –

Verwandte Themen