Request: Post mit leerem Array im Formular entfernt die Eigenschaft

Erstellt am 15. Aug. 2017  ·  3Kommentare  ·  Quelle: request/request

Zusammenfassung


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.

Einfachstes Beispiel zum Reproduzieren

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)
})

Erwartetes Verhalten




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: [] } ] }

Aktuelles Verhalten



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: {}

Mögliche Lösung


Kontext


Ihre Umgebung

| Software | Ausführung
| ---------------- | -------
| Anfrage | 2.81.0
| Knoten | 8.3.0
| npm | 5.1.0
| Betriebssystem | Ubuntu 16.04.2 LTS

stale

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="

Alle 3 Kommentare

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="

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

mlegenhausen picture mlegenhausen  ·  4Kommentare

ghost picture ghost  ·  3Kommentare

jdarling picture jdarling  ·  3Kommentare

xin7c picture xin7c  ·  3Kommentare

codecowboy picture codecowboy  ·  3Kommentare