Request: JSON.parse schlägt wegen BOM-Zeichen fehl

Erstellt am 5. Jan. 2018  ·  3Kommentare  ·  Quelle: request/request

Zusammenfassung

BOM wird nicht aus dem Antworttext entfernt, wenn der Body mit Puffer gefüllt ist

Einfachstes Beispiel zum Reproduzieren

    request({
        url: url,
        json: true,
        strictSSL: false,
    }, (error, response, data) => {
        if (error) {
            throw error;
        }

        if (response.statusCode === 200) {
            // data is string instead of json deserialized object 
        }
    })

Erwartetes Verhalten

BOM-Zeichen entfernt und Json-Antwort deserialisiert

Aktuelles Verhalten

JSON.parse schlägt fehl und eine Zeichenfolge wird zurückgegeben

Mögliche Lösung

    if (bufferLength) {
      debug('has body', self.uri.href, bufferLength)
      response.body = Buffer.concat(buffers, bufferLength)
      if (self.encoding !== null) {
        response.body = response.body.toString(self.encoding)
      }
      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.
      // This can lead to leaky behavior if the user retains a reference to the request object.
      buffers = []
      bufferLength = 0
    } else if (strings.length) {
      // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.
      // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().
      if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') {
        strings[0] = strings[0].substring(1)
      }
      response.body = strings.join('')
    }

Wie wir sehen, wird das Stücklistenzeichen entfernt, wenn Zeichenfolgen anstelle von Puffer verwendet werden
Extrahieren Sie den Code außerhalb von else if (strings.length), um den Antworttext immer zu bereinigen.

Kontext

Lesen der Json-Antwort von einer benutzerdefinierten Prahlerei des Unternehmens basierend auf Swashbuckle

Ihre Umgebung

| Software | Ausführung
| ---------------- | -------
| Anfrage | 2.83,0
| Knoten | 9.3.0
| npm | 5.5.1
| Betriebssystem | Windows 10

stale

Hilfreichster Kommentar

Wenn wir in den Optionen der Anfrage die Kodierung: 'utf8' setzen, wird die Antwort geparst

Alle 3 Kommentare

Wenn wir in den Optionen der Anfrage die Kodierung: 'utf8' setzen, wird die Antwort geparst

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 sehe dieses Problem auch - danke für das Posten der Problemumgehung - wäre schön, wenn die Bibliothek dies jedoch behandeln würde.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen