2013-09-06 6 views
9

Lassen Sie uns sagen, ich habe einen Stapel von Objekten des gleichen Typs auf der gleichen Seite bearbeiten:Umgang mit Eingabe-Arrays in Express-Formularen?

//-jade 
form(action='', method='POST') 
    for each message_id in messages_ids 
     input(type='text', name='message', id='#{message_id}') 
     input(type='text', name='author', id='#{message_id}') 
    input(type='submit', value='Send') 

Ich weiß ich werde nicht einer solchen Form auf Back-End ‚Ursache von id verarbeiten können - es wird nicht gesendet werden backend. Aber gibt es einen Weg, es zu tun? Ich möchte so etwas auf Backend bekommen:

//js 
for (var i = 0; i <= req.body.message.length; i++) { 
    console.log (
     'ObjectID: ' + req.body.message[i].id, //-? null, just to show what I'm trying to get 
     'Message: ' + req.body.message[i], 
     'Author: ' + req.body.author[i] 
    ); 
} 

Es ist Pseudocode (es funktioniert nicht). Also, irgendwelche Ideen?

P.S. Ich erhalte, wie diese

+0

'name' wird verwendet, um Eingabedaten in Formularen nicht 'id' zu senden. – user568109

Antwort

18

Für bodyParser.urlencoded ohne AJAX tun, wenn Sie die extended Option true, Attributnamen des Formats eingestellt werden property[nestedProperty] wie durch die bodyParser Middleware interpretiert werden:

{ property: nestedPropert: $value } 

einfach sein sicher, dass die Middleware wie so zu initialisieren:

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

Danach die obige Formulardeklaration ändert die Nachrichteneigenschaft sein ein Objekt, anstelle einer Zeichenfolge haben Wert, etwa so:

form(action='', method='POST') 

    - for (var i = 0; i < messages_ids.length; i++) 
     - var message_id = messages_ids[i] 
     //- so we're treating each index like a property of `message` 
     input(type='text', name='messages[#{i}][message]') 
     input(type='text', name='messages[{#{i}}][author]') 
     input(type='hidden', name='messages[#{i}][id]', value='#{message_id}') 

    input(type='submit', value='Send') 

Und dann auf der Seite Server, würde request.body.messages ein Objekt sein, die wie folgt aussieht:

{ 
    "messages": { 
    "1": { 
     "message": $message1, 
     "author": $author1, 
     "id": $id1 
    }, 
    "2": { 
     "message": $message2, 
     "author": $author2, 
     "id": $id2 
    } /* , ... */ 
    } 
} 

Und dann können request.body.messages leicht umwandeln in ein Array, Sie:

var messages = Array.prototype.slice.call(request.body.messages); 

Und jetzt, sollten Sie in der Lage sein, jedes Element zuzugreifen wie so (Anmerkung: ich ziehe einen funktionalen Stil, aber ich werde es mit Ihnen konsistent halten):

for (var i = 0; i < messages.length; i++) { 
    console.log({ 
    'ObjectId' + messages[i].id, 
    'Message' + messages[i].message, 
    'Author' + messages[i].author 
    }); 
} 

PS: Wenn Sie von einem funktionalen Stil sich fragen, hier ist es:

messages.forEach(function (message) { 
    console.log(
    'ObjectId' + message.id, 
    'Message' + message.message, 
    'Author' + messages.author 
); 
}); 

bearbeiten: Besonderer Dank für den Hinweis auf @eye_mew, dass wir extended einstellen müssen true.

+1

Einfach und großartig, das ist, was ich gesucht habe, danke! – f1nn

+1

Kein Problem. Ich habe auch die Antwort aktualisiert, um es sauberer zu machen. –

+5

Funktioniert das noch mit Express 4. *? Ich habe einen ähnlichen Ansatz versucht, aber meine Array-Eingaben werden als Strings übergeben: '{'user [last_name]': 'asd', 'user [Vorname]': 'asd'}' –