2017-06-07 42 views
8

Mam aplikację internetową Polymer wdrożoną przy użyciu hostingu Firebase.Uncaught SyntaxError: Identyfikator "baseUrl" został już zadeklarowany

Trasowanie między widokami działa, ale obsługa strony z błędami nie jest.

udało mi się odtworzyć problem na minimalnym przykład przy użyciu oficjalnego polimerowo-2-starter-kit przykład:

https://fir-polymer-404-issue.firebaseapp.com/

Na przykład, jeśli otworzysz następujący adres URL, błąd strona nie jest wyświetlana:

https://fir-polymer-404-issue.firebaseapp.com/not-existing

Zamiast tego pojawia się błąd poniżej:

my-not-existing.html:56 Uncaught SyntaxError: Identifier 'baseUrl' has already been declared 
    at my-not-existing.html:56 
(anonymous) @ my-not-existing.html:56 

Plik konfiguracyjny firebase.json wykorzystywane do poprzedniego przykładu jest tutaj:

{ 
    "hosting": { 
    "public": ".", 
    "rewrites": [ 
     { 
     "source": "**", 
     "destination": "/index.html" 
     } 
    ] 
    } 
} 

chciałbym mieć obsługę stronę błędu popełnionego przez polimer.

Należy pamiętać, że ta sama aplikacja obsługiwana przez polymer serve działa poprawnie.

Wygląda na to, że problem pochodzi z konfiguracji hostingu Firebase. Cały ruch jest przekierowywany do index.html, więc gdy Polymer załaduje nieistniejącą stronę, serwer Firebase zwraca odpowiedź HTTP 200. Niestety, nie mam pojęcia, jak rozwiązać problem.

Próbowałem stworzyć przekierowanie dla non-404 odpowiedzi tylko z następującego pliku konfiguracyjnego:

{ 
    "hosting": { 
    "public": ".", 
    "redirects": [ 
     { 
     "source": "**", 
     "destination": "/index.html", 
     "type": 200 
     } 
    ] 
    } 
} 

Niestety, obiekt typ może być używany tylko kod 3xx:

Error: HTTP Error: 400, hosting.redirects[0].type is not one of enum values: 301,302,303,304,305,307,308 

Należy również pamiętać, że niestandardowy plik 404.html to placed at the root.

Jedyne rozwiązanie, które widzę, to lista wszystkich istniejących tras (w jednym pliku), ale wygląda na szaloną.

Każdy pomysł jest mile widziany.

+0

Widziałem 304 na nieistniejącym adresie URL. zaktualizowałeś to? –

+0

Nie, plik konfiguracyjny _firebase.json_ nie został dotknięty. – Laurent

Odpowiedz

3

Powodem, dla którego baza ogniowa lub polimer nie będzie obsługiwać twojej strony 404 jest to, że gdy zażądasz nieistniejącej strony, to nie tylko powróci z kodem statusu 200, ale również powróci z kodem HTML index stronę, więc wyświetli coś, chociaż to coś jest naprawdę niczym.

Teraz sposób, w jaki jest ustawiony polimer, wyszukuje widoki w folderze src, więc chcesz przepisać tylko w katalogu głównym, a nie w folderze src. Tak zmienić firebase.json być

{ 
    "hosting": { 
     "public": ".", 
     "rewrites": [{ 
      "source": "/*", 
      "destination": "/index.html" 
     }] 
    } 
} 

Singiel * będzie oznaczać pliki ale nie podfoldery, pozwoli to Twój wyznaczania trasy do pracy po wprowadzeniu go w pasku adresu, ale jeśli strona nie zostanie znaleziona 404 będą obsługiwane według szlaków polimerów. Dla przykładu przygotowałem aplikację typu "firebase" z użyciem polimerowego pakietu startowego.

https://testforsoissue.firebaseapp.com/view2

będzie działać i zajmie Ci view2 jako początkowy wniosek zostanie przepisana do powrotu index.html ale wniosek o /src/my-view2.html nie będzie

także mając na uwadze, że trasa nie jest zdefiniowany

https://testforsoissue.firebaseapp.com/not-existing

Wyrzuci 404 (w polimerze), ponieważ początkowe żądanie zostanie ponownie przepisane, aby zwrócić index.html, ale ponownie quest dla /src/my-not-existing.html nie będzie i chętnie zrzuci 404!

P.S. Przyczyną błędu 'baseUrl' has already been declared' Wynika to z faktu, strona została przy użyciu dwukrotnie index.html, który deklaruje się baseURL na najwyższym

Edytuj

Jeśli masz podścieżki wydaje się jak możesz skorzystać z firebase.json jak więc

{ 
    "hosting": { 
     "public": ".", 
     "rewrites": [{ 
      "source": "!/src/*", 
      "destination": "/index.html" 
     }] 
    } 
} 
+0

Dzięki za pomoc. Co się jednak stanie, jeśli URL zawiera ścieżki podrzędne, takie jak 'https: // testforsoissue.firebaseapp.com/view2/myId'. W takim przypadku wydaje się, że Polymer nie będzie w stanie obsłużyć żądania, ponieważ przekierowanie do index.html nie jest ustawione dla podścieżek. W prawdziwym scenariuszu aplikacji, takim jak ten, który próbuję zbudować, jest to problem. – Laurent

+0

@Laurent Zobacz moją edycję – George

+1

Wygląda dobrze, wielkie dzięki. – Laurent

-1

Zgodnie z documentation, nie trzeba wykonywać czynności; po prostu stwórz 404.html:

You can specify a custom 404/Not Found error to be served when a user tries to access a page that does not exist. Simply add a 404.html page to the your project's public directory and the contents of this page will be displayed when Firebase Hosting needs to display a 404 Not Found error to the user.


Aby uniknąć błędu baseURL, jeśli masz dostęp do tej linii kodu:

let baseUrl = document.querySelector('base').href;

Spróbuj zmienić ją na:

baseUrl = baseUrl || document.querySelector('base').href;

To nie jest zbyt miłe, ale nie powinno narzekać wartość już zdefiniowana.

Chociaż myślę, że nie ma to związku z Twoim problemem i może przestać wyświetlać ten błąd po zdefiniowaniu prawidłowej strony 404.

+0

Dzięki za pomoc. Zaktualizowałem projekt, wykonując 2 sugestie, ale jak widać, żadna nie pomaga. Niestety, niestandardowa [strona błędu] (https://fir-polymer-404-issue.firebaseapp.com/404.html) nie jest zwracana, gdy domyślne zmiany do _index.html_ są na miejscu, a ta ostatnia jest wymagana do korzystania z Polymer ze ścieżkami oddzielonymi ukośnikami. – Laurent