Es scheint, dass das Formular beim Posten in irgendeiner Form optimiert wird. Das ist schlecht für mich, es entfernt Eigenschaften aus dem Formular.
Ich versuche, ein Objekt mit einer Eigenschaft zu senden, die ein Array enthält, das leer sein könnte.
Jedes Mal, wenn das Array leer ist, wird ein MissingPropertyError zurückgegeben, was falsch ist, da das leere Array tatsächlich den Wert besitzt, die Eigenschaft überhaupt nicht zu haben.
const request = require( 'request' )
const bodyParser = require('body-parser')
const app = require('express')()
app.use( bodyParser.json() )
app.use( bodyParser.urlencoded( { extended: true } ) )
app.post('/', function( req, res ){
console.log( 'received:', req.body )
res.send('ok')
})
app.listen( 53153 )
const req = {
url: 'http://localhost:53153',
method: 'POST',
headers: {
'Content-Type' : 'application/x-www-form-urlencoded'
},
form: {
emptyArray: [],
filledArray: [{something:[]}]
}
}
console.log( 'sending:', req )
request( req , function( err, httpResponse, body ){
process.exit(0)
})
Ich habe erwartet, dass das Sendeobjekt empfangen wird, da es ein gültiges json ist
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: { emptyArray: [], filledArray: [ { something: [] } ] }
Es stellt sich heraus, dass das empfangene Objekt nichts anderes als ein leeres Objekt ist, bei der Betrachtung von Wireshark ist die gesendete Inhaltslänge 0.
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: {}
Das Hinzufügen von null zum Array ändert das Verhalten:
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [ null ], filledArray: [ { something: [ null ] } ] }
received: { emptyArray: [ '' ], filledArray: [ { something: [ '' ] } ] }
Das Hinzufügen von undefined in den Arrays ändert jedoch das Verhalten nicht:
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [ undefined ], filledArray: [ { something: [ undefined ] } ] }
received: {}
| Software | Ausführung
| ---------------- | -------
| Anfrage | 2.81.0
| Knoten | 8.3.0
| npm | 5.1.0
| Betriebssystem | Ubuntu 16.04.2 LTS
Es scheint also, dass das JSON-Objekt in eine Zeichenfolge konvertiert und vor dem Senden als Hauptteil der Anfrage festgelegt wird. Dies ist das Standardverhalten, wenn Sie das Attribut 'form' angeben. Die Methode, die diese Bibliothek verwendet, um JSON in eine Zeichenfolge zu konvertieren, entfernt leere Arrays. Was Sie tun müssen, ist, anstatt das 'form'-Attribut zu übergeben, das 'body'-Attribut und JSON.stringify Ihr JSON-Objekt, um es in einen String umzuwandeln. Zum Beispiel:
HINWEIS: MÜSSEN SIE MÖGLICHERWEISE MIT DEN HEADERN ARBEITEN UND application/json als Inhaltstyp verwenden. Ich habe nicht experimentiert, um zu sehen, was funktioniert.
{
url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/json'},
body: JSON.stringify({ emptyArray: [], filledArray: [ { something: [] } ] })
}
Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivität hatte. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.
Ich kann nicht glauben, dass keiner der Leute, die an diesem Projekt arbeiten, dazu beigetragen hat. Die obige Antwort ist ungültig, da sie den genannten Anwendungsfall nicht versteht. Warum stellen wir ein Beispiel für "application/json" zur Verfügung, wenn es sich eindeutig um "application/x-www-form-urlencoded" handelt. Dies ist ein Problem, das immer noch auftritt, aber leider nicht beachtet wird.
In meinem Test verschwinden die undefinierten und leeren Arrays in den Ergebnissen und alles, was "null" ist, erscheint in der url-encoded-string.
ein json von:
{
results: {
arr1: [],
arr2: undefined,
arr3: null,
foo: {
arr4: []
}
}
}
ergibt eine URL mit nur
"?results%5Barr3%5D="
Hilfreichster Kommentar
Ich kann nicht glauben, dass keiner der Leute, die an diesem Projekt arbeiten, dazu beigetragen hat. Die obige Antwort ist ungültig, da sie den genannten Anwendungsfall nicht versteht. Warum stellen wir ein Beispiel für "application/json" zur Verfügung, wenn es sich eindeutig um "application/x-www-form-urlencoded" handelt. Dies ist ein Problem, das immer noch auftritt, aber leider nicht beachtet wird.
In meinem Test verschwinden die undefinierten und leeren Arrays in den Ergebnissen und alles, was "null" ist, erscheint in der url-encoded-string.
ein json von:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
ergibt eine URL mit nur
"?results%5Barr3%5D="