fix: "Unexpected token '<'" bei Uploads durch die echte Ursache ersetzen
Alle drei Admin-Upload-Felder riefen response.json() ungeprueft auf. Kam statt JSON eine HTML-Seite zurueck, warf der Parser Unexpected token '<', "<!DOCTYPE "... is not valid JSON und genau dieser Text landete im Formular. Damit war die eigentliche Ursache vollstaendig verdeckt: weder der HTTP-Status noch die Schicht, die abgebrochen hat, waren daraus ablesbar. Der Punkt dabei: die Upload-Route-Handler antworten ausnahmslos mit JSON, auch in jedem Fehlerfall — lokal verifiziert bis hinauf zur Limit-Ueberschreitung (105 MB -> 413 mit JSON-Body). Trifft im Browser trotzdem HTML ein, stammt die Antwort gar nicht aus der Anwendung, sondern aus einer Schicht davor: Reverse-Proxy, CDN oder Gateway, das den Request wegen zu grossem Body abgewiesen oder wegen Zeitueberschreitung beim Transcoding abgebrochen hat. readUploadResponse() in lib/upload-client.ts prueft deshalb zuerst den Content-Type und reicht andernfalls den HTTP-Status nach oben, statt zu parsen. Die Felder zeigen daraus eine Meldung, die den Status nennt und die wahrscheinliche Ursache benennt (413 = vom Proxy abgewiesen, 502/503/504/522/524 = Zeitueberschreitung beim Umrechnen, sonst unerwartet). Ein Verbindungsabbruch, bei dem fetch() selbst wirft, wird getrennt gemeldet. Das behebt nicht die Ursache jenseits der Anwendung — es macht sie zum ersten Mal ablesbar, statt sie hinter einem Parser-Fehler zu verbergen.
This commit is contained in:
1 parent
be5fb32a4a
commit
b11edd7751
8 files changed
+219
-15
No files matched your search
@@ -840,6 +840,12 @@ export interface Dictionary {
|
||||
remove: string;
|
||||
removeImageAt: (position: number) => string;
|
||||
uploadError: string;
|
||||
/** Meldung, wenn die Antwort gar kein verwertbares JSON war — dann ist
|
||||
* nur der HTTP-Status bekannt (siehe lib/upload-client.ts). */
|
||||
uploadErrorStatus: (status: number) => string;
|
||||
/** Meldung, wenn der Request den Server gar nicht erreicht hat oder die
|
||||
* Verbindung waehrend des Uploads abbrach. */
|
||||
uploadErrorNetwork: string;
|
||||
};
|
||||
/** Wie adminImageField, aber fuer AdminVideoField (Hero-Hintergrundvideo,
|
||||
* admin/inhalte). */
|
||||
@@ -849,6 +855,10 @@ export interface Dictionary {
|
||||
uploading: string;
|
||||
remove: string;
|
||||
uploadError: string;
|
||||
/** Wie adminImageField.uploadErrorStatus, aber mit dem fuer Videos
|
||||
* haeufigsten Grund (Zeitueberschreitung beim Umrechnen) im Text. */
|
||||
uploadErrorStatus: (status: number) => string;
|
||||
uploadErrorNetwork: string;
|
||||
};
|
||||
adminShell: {
|
||||
navDashboard: string;
|
||||
|
||||
Reference in new issue
Block a user