2014-05-15 4 views
5

Ich habe eine einfache Form:multipart/form-data mit Arrays

<form method="post" action="/test"> 
    <input type="hidden" name="arr[]" value="val1"> 
    <input type="hidden" name="arr[]" value="val2"> 
    <input type="hidden" name="arr[]" value="val3"> 
    <input type="submit" value="Submit"> 
</form> 

Mit dem Controller:

//... 
server.post('/test', function(req, res) { 
    res.json(req.body); 
}); 
//... 

Das gibt fein mit:

{ 
    arr: [ 
    "val1", 
    "val2", 
    "val3" 
    ] 
} 

Allerdings, wenn ich Ändern Sie den Enctype in multipart/formdata

<form method="post" action="/test" enctype="multipart/form-data"> 
    <input type="hidden" name="arr[]" value="val1"> 
    <input type="hidden" name="arr[]" value="val2"> 
    <input type="hidden" name="arr[]" value="val3"> 
    <input type="submit" value="Submit"> 
</form> 

Der Server antwortet nun mit:

{ 
    arr[]: "val3" 
} 

Was das Problem ist? Gibt es eine Art von Konfiguration, die ich brauche?

Falls Sie sich wundern, ich sende auch eine Datei, deshalb brauche ich die multipart/form-data.

+1

mehr Sieht aus wie Multiparty behandelt diese Situation nicht korrekt. Würde mich interessieren was zu sehen ist. Wenn Sie keine Lösung finden, versuchen Sie es unter: https://github.com/andrewrk/node-multiparty/issues –

+0

Haben Sie herausgefunden, was los war? Ich habe das gleiche Problem hier –

+0

Die Array-Syntax ist eine nicht-Standard-Erweiterung zur Formularsyntax. Ihr Body-Parse für URL-codierte Daten erkennt es, aber Ihr Body-Parser für Multipart-Daten nicht. Sie haben kein [mcve] bereitgestellt, so dass wir nicht wissen, welche Body-Parser Sie verwenden. Daher können wir nicht sagen, ob dies daran liegt, dass keine Unterstützung vorhanden ist oder die Unterstützung nur aktiviert werden muss. – Quentin

Antwort

0

Es ist wahrscheinlich auf die Verwendung von body-parser (vor allem der urlencoded Methode), die by default, Arbeiten auf Anfragen mit dem Medien-Typ application/x-www-form-urlencoded nur verwandt.

Ihr Hauptanwendungsmodul hat wahrscheinlich ein paar Zeilen wie diese:

const bodyParser = require('body-parser'); 
app.use(bodyParser.urlencoded()); 

Ich nehme an, könnte man nur hinzufügen, die Anfragen des Typs haben folgende multipart/form-data auch analysiert:

app.use(bodyParser.urlencoded({ 
    type: 'multipart/form-data' 
})); 
+0

Die mehrteilige Syntax unterscheidet sich vollständig von der urlencodierten Syntax. Sie können einen Parser nicht mit dem anderen verwenden. – Quentin

+0

Whoops, mein Schlechter! Da body-parser keine mehrteilige Syntax hat, benötigen Sie ein dediziertes Modul für die Behandlung von mehrteiligen Anfragen, wie busboy oder multer, wie in der body-parser-Dokumentation erwähnt. –

+0

Sie benutzen bereits eins (sonst würden sie nicht die Ergebnisse bekommen, die sie sagten, dass sie bekommen), aber wir wissen nicht welche. – Quentin