2017-04-17 4 views
0

Dies ist eher eine allgemeine Frage. Mein Swagger API funktioniert einwandfrei, wenn ich IE11, Chrome, FireFox und mehr benutze, aber IE10 und unten bekomme ich einen Fehler: failed to parse JSON/YAML und in meinem swagger.inspec().state kommt "rejected" zurück.IE10 Swagger Error JSON/YAML konnte nicht analysiert werden

Hier ist, wie ich meinen Kunde bin Instanziierung:

import { API_URI } from '../config/app_config'; // '/accountservice/swagger.json' 
import Swagger from 'swagger-client'; // "swagger-client": "^2.1.17" 

export const buildAccountServiceClient =() => { 
    const swagger = new Swagger({ 
    url: (!window.location.origin ? IE_API_URI : API_URI), 
    usePromise: true, 
    }); 

    // Reconfigure swagger client to override service path if we're using a reverse proxy: 
    // /accountservice/swagger.json -> /accountservice 
    // Originally tried setting basePath to null, undefined, and '', but that didn't work 
    let basePath; 
    if (API_URI.startsWith('/')) { 
    basePath = API_URI.substring(0, API_URI.lastIndexOf('/')); 
    swagger.then((client) => { 
     client.setBasePath(basePath); 
     if (typeof(window) !== 'undefined') { 
     // use current protocol, so either http or https 
     client.setSchemes([window.location.protocol.slice(0, -1)]); 
     } 
    }); 
    } 
    return swagger; 
}; 

ich auch einen Proxy-Server verwenden, weshalb ich die API_URI nicht als vollständige URL definiert habe, sondern nur den Weg.

Warum würde dies in allen anderen Browsern außer IE10 funktionieren, obwohl IE10 unterstützt wird?

+0

Welche Version von Swagger UI? Das neueste 3.0.x [unterstützt IE10 nicht] (https://github.com/swagger-api/swagger-ui#browser-support). – Helen

+0

nein Ich benutze '" swagger-client ":"^2.1.17 "' Ich fügte ein wenig mehr Kontext hier hinzu: https://github.com/swagger-api/swagger-js/issues/1018 –

Antwort

0

Nach dem Tauchen durch Swagger-JS-Quellcode in meinem node_modules-Ordner.

Was ich entdeckte, war die Initialisierungsmethode versuchte, die aktuelle Fensterpositionen "Ursprung" zu holen, um an den Anfang des URL-Pfads hinzuzufügen, der an den Konstruktor übergeben wurde.

Da im IE10-Fensterobjekt kein Schlüssel origin vorhanden ist, wurde die URL in undefined/swagger.json übersetzt.

Um dies zu beheben, habe ich die Änderung unter:

node_modules/swagger-client/lib/client.js line:129

line 126 if(this.url && this.url.indexOf('http:') === -1 && this.url.indexOf('https:') === -1) { 
    line 127 // no protocol, so we can only use window if it exists 
    line 128 if(typeof(window) !== 'undefined' && window && window.location) { 
    line 129  this.url = window.location.protocol + "//" + window.location.host + this.url; 
    line 130 } 
    line 131 } 

In IE10, das Fensterobjekt enthält keine Objektschlüssel namens location.origin wenn andere Browser tun.

Also, wenn Sie wollen, dass diese in IE10 zur Arbeit kommen:

line 129 this.url = window.location.protocol + '//' + window.location.host + this.url; 

Ich bin Gunna versuchen, eine PR einreichen stolzieren diese behoben.

--UPDATE--

Wenn Sie nicht wollen, für die PR warten, um durch zu gehen und ein Update auf Ihrer Seite benötigen:

http://tosbourn.com/a-fix-for-window-location-origin-in-internet-explorer/

Oder hier ist mein fix :

const API_URI = '/swagger.json'; 
const IE_API_URI = `${window.location.protocol}//${window.location.hostname}${(window.location.port ? `:${window.location.port}` : '')}/swagger.json`; 

const swagger = new Swagger({ 
    url: (!window.location.origin ? IE_API_URI : API_URI), 
    usePromise: true, 
}); 
Verwandte Themen