UX bei Datenbank-Constraint-Fehlern: Fehler in klare Meldungen verwandeln
Erfahre, wie UX für Datenbank-Constraint-Fehler in hilfreiche Feldmeldungen verwandelt wird, indem du Unique-, Foreign-Key- und NOT NULL-Fehler in deiner App korrekt zuordnest.

Warum Constraint-Fehler für Nutzer so schlecht wirken
Wenn jemand auf Speichern tippt, erwartet er eines von zwei Ergebnissen: es hat funktioniert, oder er kann schnell beheben, was nicht stimmt. Zu oft bekommen sie ein generisches Banner wie „Request failed“ oder „Etwas ist schiefgelaufen.“ Das Formular bleibt gleich, nichts ist hervorgehoben, und sie müssen raten.
Diese Lücke ist der Grund, warum UX bei Datenbank-Constraint-Fehlern wichtig ist. Die Datenbank erzwingt Regeln, die der Nutzer nie gesehen hat: „Dieser Wert muss einzigartig sein“, „Dieser Datensatz muss auf ein vorhandenes Element verweisen“, „Dieses Feld darf nicht leer sein.“ Wenn die App diese Regeln hinter einer vagen Fehlermeldung versteckt, fühlt sich der Nutzer für ein Problem verantwortlich, das er nicht verstehen kann.
Generische Fehler zerstören außerdem Vertrauen. Nutzer nehmen an, die App sei instabil, versuchen es erneut, aktualisieren die Seite oder brechen die Aufgabe ab. Im Arbeitskontext schreiben sie den Support mit Screenshots an, die nicht helfen, weil der Screenshot keine nützlichen Details enthält.
Ein häufiges Beispiel: Jemand legt einen Kunden an und bekommt „Save failed.“ Er versucht es noch einmal mit derselben E-Mail. Es schlägt wieder fehl. Jetzt fragt er sich, ob das System Daten dupliziert oder verliert – oder beides.
Die Datenbank ist oft die letzte Instanz der Wahrheit, selbst wenn du in der UI validierst. Sie sieht den aktuellen Zustand, inklusive Änderungen von anderen Nutzern, Hintergrundjobs und Integrationen. Constraint-Fehler werden also passieren, und das ist normal.
Ein gutes Ergebnis ist einfach: Verwandle eine Datenbankregel in eine Meldung, die auf ein konkretes Feld zeigt und einen nächsten Schritt anbietet. Zum Beispiel:
- „E-Mail wird bereits verwendet. Versuche eine andere E-Mail oder melde dich an.“
- „Wähle ein gültiges Konto. Das ausgewählte Konto existiert nicht mehr.“
- „Telefonnummer ist erforderlich."
Der Rest des Artikels geht darum, wie du diese Übersetzung machst, damit Fehler in schnelle Wiederherstellung münden — egal, ob du den Stack von Hand codest oder mit einem Tool wie AppMaster arbeitest.
Die Constraint-Typen, auf die du stoßen wirst (und was sie bedeuten)
Die meisten „Request failed“-Momente kommen von einer kleinen Menge Datenbankregeln. Wenn du die Regel benennen kannst, kannst du sie meist in eine klare Meldung für das richtige Feld übersetzen.
Hier sind die gängigen Constraint-Typen in einfacher Sprache:
- Unique constraint: Ein Wert muss einzigartig sein. Typische Beispiele sind E-Mail, Benutzername, Rechnungsnummer oder eine externe ID. Wenn er fehlschlägt, hat der Nutzer nichts „falsch“ gemacht, er ist mit vorhandenen Daten kollidiert.
- Foreign key constraint: Ein Datensatz verweist auf einen anderen Datensatz, der existieren muss (wie
order.customer_id). Er tritt auf, wenn das referenzierte Objekt gelöscht wurde, nie existierte oder die UI die falsche ID gesendet hat. - NOT NULL constraint: Ein erforderlicher Wert fehlt auf Datenbankebene. Das kann passieren, obwohl das Formular vollständig aussieht (z. B. weil die UI ein Feld nicht gesendet oder die API es überschrieben hat).
- Check constraint: Ein Wert liegt außerhalb einer erlaubten Regel, z. B. „Menge muss \u003e 0 sein“, „Status muss einer dieser Werte sein“ oder „Rabatt muss zwischen 0 und 100 liegen."
Das Schwierige ist, dass dasselbe reale Problem je nach Datenbank und Tools unterschiedlich aussehen kann. Postgres benennt Constraints (hilfreich), während ein ORM es in eine generische Exception verpacken kann (weniger hilfreich). Selbst derselbe Unique-Constraint kann als „duplicate key“, „unique violation“ oder als vendorspezifischer Fehlercode erscheinen.
Ein praktisches Beispiel: Jemand bearbeitet einen Kunden im Admin-Panel, klickt auf Speichern und bekommt einen Fehler. Wenn die API der UI mitteilen kann, dass es ein Unique-Constraint auf email war, kannst du „Diese E-Mail wird bereits verwendet“ unter dem E-Mail-Feld anzeigen, statt eines vagen Toasts.
Behandle jeden Constraint-Typ als Hinweis darauf, was die Person als Nächstes tun kann: einen anderen Wert wählen, einen bestehenden verwandten Datensatz auswählen oder das fehlende Pflichtfeld ausfüllen.
Was eine gute feldbezogene Meldung leisten muss
Ein Datenbank-Constraint-Fehler ist ein technisches Ereignis, aber das Erlebnis sollte sich wie normale Hilfestellung anfühlen. Gute UX verwandelt „etwas ist kaputt“ in „das kannst du so beheben“, ohne den Nutzer raten zu lassen.
Verwende einfache Sprache. Tausche Datenbankbegriffe wie „unique index“ oder „foreign key“ gegen etwas, das ein Mensch sagen würde. „Diese E-Mail wird bereits verwendet“ ist viel nützlicher als „duplicate key value violates unique constraint."
Platziere die Meldung dort, wo die Aktion stattfindet. Wenn der Fehler eindeutig zu einem Eingabefeld gehört, hänge ihn an dieses Feld, damit der Nutzer ihn sofort beheben kann. Wenn es um die gesamte Aktion geht (z. B. „Sie können das nicht löschen, weil es anderswo verwendet wird“), zeige ihn auf Formularebene mit einem klaren Hinweis zum nächsten Schritt.
Spezifisch ist besser als höflich. Eine hilfreiche Meldung beantwortet zwei Fragen: was muss geändert werden, und warum wurde es abgelehnt. „Wähle einen anderen Benutzernamen“ ist besser als „Ungültiger Benutzername.“ „Wähle einen Kunden bevor du speicherst“ ist besser als „Fehlende Daten."
Sei vorsichtig mit sensiblen Details. Manchmal verrät die „hilfreichste“ Meldung zu viel. Auf Login- oder Passwort-zurücksetzen-Seiten kann „Kein Konto für diese E-Mail vorhanden“ Angreifern helfen. Verwende in solchen Fällen sichere Formulierungen wie „Wenn ein Konto mit dieser E-Mail existiert, erhältst du eine Nachricht.“
Plane auch für mehr als ein Problem gleichzeitig. Ein einzelnes Speichern kann auf mehreren Constraints scheitern. Deine UI sollte mehrere Feldmeldungen gleichzeitig anzeigen können, ohne zu überfordern.
Eine starke feldbezogene Meldung verwendet einfache Worte, zeigt auf das richtige Feld (oder ist eindeutig auf Formularebene), sagt dem Nutzer, was zu tun ist, vermeidet das Offenlegen privater Fakten über Konten oder Datensätze und unterstützt mehrere Fehler in einer Antwort.
Entwerfe einen Fehlervertrag zwischen API und UI
Gute UX beginnt mit einer Vereinbarung: Wenn etwas fehlschlägt, sagt die API der UI genau, was passiert ist, und die UI zeigt es immer auf dieselbe Weise an. Ohne diesen Vertrag landest du wieder bei einem generischen Toast, der niemandem hilft.
Eine praktische Fehlerstruktur ist klein, aber spezifisch. Sie sollte einen stabilen Fehlercode, das Feld (wenn es auf ein einzelnes Eingabefeld passt), eine menschenlesbare Meldung und optionale Details für Logs enthalten.
{
"error": {
"code": "UNIQUE_VIOLATION",
"field": "email",
"message": "That email is already in use.",
"details": {
"constraint": "users_email_key",
"table": "users"
}
}
}
Der Schlüssel ist Stabilität. Zeige den Nutzern keinen rohen Datenbanktext, und lass die UI nicht Postgres-Fehlerstrings parsen. Codes sollten über Plattformen hinweg (Web, iOS, Android) und über Endpunkte hinweg konsistent sein.
Entscheide im Voraus, wie du Feldfehler vs. Formfehler darstellst. Ein Feldfehler bedeutet, dass eine Eingabe blockiert ist (setze field, zeige die Meldung unter dem Eingabefeld). Ein Formfehler bedeutet, dass die Aktion nicht abgeschlossen werden kann, obwohl die Felder gültig aussehen (lässt field leer, zeige die Meldung neben dem Speichern-Button). Wenn mehrere Felder gleichzeitig fehlschlagen können, gib ein Array von Fehlern zurück, jedes mit eigenem field und code.
Um das Rendering konsistent zu halten, mache deine UI-Regeln langweilig und vorhersehbar: zeige die erste Fehlermeldung oben als kurze Zusammenfassung und inline neben dem Feld, halte Meldungen kurz und handlungsorientiert, verwende dieselbe Formulierung in verschiedenen Flows (Signup, Profile-Edit, Admin-Screens) und logge details, während du nur message anzeigst.
Wenn du mit AppMaster baust, behandle diesen Vertrag wie jede andere API-Antwort. Dein Backend kann die strukturierte Form zurückgeben, und deine generierten Web- (Vue3) und mobilen Apps können sie mit einem gemeinsamen Muster rendern, sodass sich jeder Constraint-Fehler wie Anleitung und nicht wie ein Absturz anfühlt.
Schritt für Schritt: DB-Fehler in Feldmeldungen übersetzen
Gute UX beginnt damit, die Datenbank als letzten Richter zu behandeln, nicht als erste Rückmeldung. Nutzer sollten niemals rohe SQL-Texte, Stacktraces oder vage „Request failed“-Meldungen sehen. Sie sollten sehen, welches Feld Aufmerksamkeit braucht und wie sie weiter vorgehen.
Ein praktischer Ablauf, der in den meisten Stacks funktioniert:
- Entscheide, wo der Fehler abgefangen wird. Wähle einen Ort, an dem DB-Fehler zu API-Antworten werden (oft die Repository/DAO-Schicht oder ein globaler Error-Handler). Das verhindert „manchmal inline, manchmal Toast“-Chaos.
- Klassifiziere das Fehlschlagen. Wenn ein Schreibvorgang fehlschlägt, erkenne die Klasse: unique constraint, foreign key, NOT NULL oder check constraint. Nutze Treiber-Fehlercodes, wenn möglich. Vermeide das Parsen von Freitext, außer du hast keine andere Wahl.
- Mappe Constraint-Namen auf Formularfelder. Constraints sind gute Identifikatoren, aber UIs brauchen Feldschlüssel. Halte ein einfaches Lookup wie
users_email_key -> emailoderorders_customer_id_fkey -> customerId. Platziere es nahe dem Code, der das Schema besitzt. - Generiere eine sichere Meldung. Baue kurze, nutzerfreundliche Texte nach Klasse, nicht nach rohem DB-Text. Unique -> „Dieser Wert wird bereits verwendet.“ FK -> „Wähle einen vorhandenen Kunden.“ NOT NULL -> „Dieses Feld ist erforderlich.“ Check -> „Wert liegt außerhalb des erlaubten Bereichs.“
- Gib strukturierte Fehler zurück und rendere sie inline. Sende eine konsistente Payload (z. B.:
[{ field, code, message }]). Hänge in der UI Meldungen an Felder, scrolle und fokussiere das erste fehlerhafte Feld und nutze ein globales Banner nur als kurze Zusammenfassung.
Wenn du mit AppMaster baust, wende dasselbe Prinzip an: fange den DB-Fehler an einer zentralen Stelle im Backend ab, übersetze ihn in ein vorhersagbares Feldfehler-Format und zeige ihn dann neben dem Eingabefeld in deiner Web- oder Mobile-UI. So bleibt das Erlebnis auch bei Änderungen im Datenmodell konsistent.
Ein realistisches Beispiel: drei fehlgeschlagene Saves, drei hilfreiche Ergebnisse
Diese Fehler werden oft in einem einzigen generischen Toast zusammengefasst. Jeder braucht jedoch eine andere Meldung, obwohl alle von der Datenbank stammen.
1) Registrierung: E-Mail bereits vergeben (Unique-Constraint)
Rohes Fehlverhalten (was du in Logs siehst): duplicate key value violates unique constraint "users_email_key"
Was der Nutzer sehen sollte: „Diese E-Mail ist bereits registriert. Versuche dich anzumelden oder verwende eine andere E-Mail.“
Platziere die Meldung neben dem E-Mail-Feld und lass das Formular ausgefüllt. Wenn möglich, biete eine sekundäre Aktion wie „Anmelden“ an, damit der Nutzer nicht rätseln muss.
2) Bestellung anlegen: Kunde fehlt (Foreign Key)
Rohes Fehlverhalten: insert or update on table "orders" violates foreign key constraint "orders_customer_id_fkey"
Was der Nutzer sehen sollte: „Wähle einen Kunden, um diese Bestellung anzulegen.“
Das fühlt sich für den Nutzer nicht wie ein „Fehler“ an, sondern wie fehlender Kontext. Hebe den Kunden-Selector hervor, behalte bereits hinzugefügte Positionen und wenn der Kunde in einem anderen Tab gelöscht wurde, sage das deutlich: „Dieser Kunde existiert nicht mehr. Wähle einen anderen.“
3) Profil aktualisieren: Pflichtfeld fehlt (NOT NULL)
Rohes Fehlverhalten: null value in column "last_name" violates not-null constraint
Was der Nutzer sehen sollte: „Nachname ist erforderlich.“
So sieht gutes Constraint-Handling aus: normales Formular-Feedback, kein Systemfehler.
Um den Support zu helfen, ohne technische Details an Nutzer zu verraten, speichere den vollständigen Fehler in Logs (oder einem internen Fehlerpanel): request-ID und Benutzer-/Session-ID, Constraint-Name (falls vorhanden) und Tabelle/Feld, die API-Payload (sensible Felder maskieren), Zeitstempel und Endpoint/Aktion sowie die nutzerseitige Meldung, die angezeigt wurde.
Foreign-Key-Fehler: dem Nutzer helfen, wieder handlungsfähig zu werden
Foreign-Key-Fehler bedeuten meist, dass die Person etwas gewählt hat, das nicht mehr existiert, nicht mehr erlaubt ist oder nicht zu den aktuellen Regeln passt. Das Ziel ist nicht nur, das Scheitern zu erklären, sondern einen klaren nächsten Schritt anzubieten.
Meistens lässt sich ein Foreign-Key-Fehler auf ein Feld abbilden: den Picker, der auf einen anderen Datensatz verweist (Kunde, Projekt, Zuständiger). Die Meldung sollte das benennen, was der Nutzer wiedererkennt, nicht das Datenbankkonzept. Vermeide interne IDs oder Tabellennamen. „Kunde existiert nicht mehr“ ist nützlich. „FK_orders_customer_id violated (customer_id=42)“ ist es nicht.
Ein solides Wiederherstellungsmuster behandelt den Fehler wie eine veraltete Auswahl. Fordere den Nutzer auf, aus der aktuellsten Liste neu auszuwählen (Dropdown aktualisieren oder Picker öffnen). Wenn der Datensatz gelöscht oder archiviert wurde, sage das offen und weise auf eine aktive Alternative hin. Wenn der Nutzer keine Berechtigung mehr hat, sag „Du hast keine Berechtigung, dieses Element zu verwenden“ und biete an, ein anderes auszuwählen oder einen Admin zu kontaktieren. Wenn das Anlegen eines verwandten Datensatzes ein normaler nächster Schritt ist, biete „Neuen Kunden anlegen“ an, statt einen erneuten Versuch zu erzwingen.
Gelöschte und archivierte Datensätze sind eine häufige Falle. Wenn deine UI inaktive Elemente zum Kontext anzeigen kann, markiere sie klar (Archiviert) und verhindere die Auswahl. Das verhindert den Fehler, behandelt ihn aber trotzdem, wenn ein anderer Nutzer die Daten ändert.
Manchmal sollte ein Foreign-Key-Fehler auf Formularebene statt auf Feldebene angezeigt werden. Mach das, wenn du nicht zuverlässig sagen kannst, welcher Verweis den Fehler verursacht hat, wenn mehrere Verweise ungültig sind oder wenn das eigentliche Problem Berechtigungen für die gesamte Aktion betrifft.
NOT NULL und Validierung: verhindere den Fehler, behandle ihn aber trotzdem
NOT NULL-Fehler sind am einfachsten zu verhindern und am ärgerlichsten, wenn sie durchrutschen. Wenn jemand nach dem Auslassen eines Pflichtfelds „Request failed“ sieht, macht die Datenbank UI-Arbeit. Gute UX bedeutet, dass die UI offensichtliche Fälle blockiert und die API trotzdem klare feldbezogene Fehler zurückgibt, wenn doch etwas schiefgeht.
Beginne mit frühzeitigen Prüfungen im Formular. Markiere Pflichtfelder nahe am Input, nicht nur in einem generischen Hinweis. Ein kurzer Hinweis wie „Erforderlich für Belege“ ist hilfreicher als nur ein roter Stern. Wenn ein Feld bedingt erforderlich ist (z. B. „Firmenname“ nur wenn „Kontotyp = Geschäftlich“), mache die Regel sichtbar, sobald sie relevant wird.
UI-Validierung allein reicht nicht. Nutzer können sie mit älteren App-Versionen, instabiler Netzwerkverbindung, Massenimporten oder Automatisierung umgehen. Spiegle dieselben Regeln in der API, damit du keinen Round-Trip verschwendest, nur um an der Datenbank zu scheitern.
Halte die Formulierungen im ganzen Produkt konsistent, damit Nutzer lernen, was jede Meldung bedeutet. Für fehlende Werte nutze „Erforderlich.“ Für Längenlimits: „Zu lang (max. 50 Zeichen).“ Für Formatprüfungen: „Ungültiges Format (z. B. [email protected]).“ Für Typprobleme: „Muss eine Zahl sein."
Partielle Updates machen NOT NULL kompliziert. Ein PATCH, das ein erforderliches Feld weglässt, sollte nicht fehlschlagen, wenn der vorhandene Wert bereits vorhanden ist, aber es sollte fehlschlagen, wenn der Client es explizit auf null oder einen leeren Wert setzt. Entscheide diese Regel einmal, dokumentiere sie und halte sie konsistent.
Ein praktikabler Ansatz ist Validierung auf drei Ebenen: Client-Formularregeln, API-Request-Validierung und ein finales Sicherheitsnetz, das einen Datenbank-NOT NULL-Fehler fängt und ihn dem richtigen Feld zuordnet.
Häufige Fehler, die wieder bei „Request failed“ landen
Der schnellste Weg, Constraint-Handling kaputtzumachen, ist, die ganze harte Arbeit in der Datenbank zu machen und das Ergebnis dann hinter einem generischen Toast zu verstecken. Nutzer interessieren sich nicht dafür, dass ein Constraint ausgelöst wurde. Sie wollen wissen, was sie tun müssen, wo und ob ihre Daten sicher sind.
Ein häufiger Fehler ist, rohen Datenbanktext anzuzeigen. Meldungen wie duplicate key value violates unique constraint wirken wie ein Absturz, selbst wenn die App sich erholen könnte. Sie erzeugen außerdem Support-Tickets, weil Nutzer beängstigenden Text kopieren statt nur ein Feld zu korrigieren.
Eine andere Falle ist das Verlassen auf String-Matching. Das funktioniert, bis du einen Treiber wechselst, Postgres upgradest oder einen Constraint umbenennst. Dann funktioniert dein Mapping stillschweigend nicht mehr und du bist wieder bei „Request failed.“ Bevorzuge stabile Fehlercodes und gib das Feld an, das die UI versteht.
Schema-Änderungen brechen Feld-Mappings häufiger, als man denkt. Eine Umbenennung von email zu primary_email kann eine klare Meldung in eine Meldung ohne Ziel verwandeln. Mach das Mapping zum Teil desselben Changesets wie die Migration und lass Tests laut fehlschlagen, wenn ein Feldschlüssel unbekannt ist.
Ein großer UX-Killer ist, jeden Constraint-Fehler als HTTP 500 ohne Body zurückzugeben. Das signalisiert der UI „Das ist ein Serverfehler“, sodass sie keine feldbezogenen Hinweise zeigen kann. Die meisten Constraint-Fehler sind vom Nutzer behebbar; gib also eine Validierungs-ähnliche Antwort mit Details zurück.
Einige Muster, auf die du achten solltest:
- Unique-E-Mail-Meldungen, die bestätigen, dass ein Konto existiert (verwende neutrale Formulierungen in Signup-Flows)
- „Einen Fehler nach dem anderen“-Handling, das das zweite fehlerhafte Feld versteckt
- Mehrstufige Formulare, die Fehler nach Vor-/Zurück verlieren
- Retries, die veraltete Werte absenden und die korrekte Feldmeldung überschreiben
- Logging, das Constraint-Namen oder Fehlercodes verwirft und Bugs schwer nachvollziehbar macht
Zum Beispiel: Wenn ein Signup-Formular „E-Mail existiert bereits“ sagt, verrät das möglicherweise, dass ein Konto existiert. Eine sicherere Meldung lautet „Überprüfe deine E-Mail oder versuche, dich anzumelden“, während der Fehler weiterhin am E-Mail-Feld hängt.
Kurze Checkliste vor dem Release
Bevor du auslieferst, prüfe die kleinen Details, die entscheiden, ob ein Constraint-Fehler wie ein hilfreicher Hinweis oder eine Sackgasse wirkt.
API-Antwort: Kann die UI wirklich damit arbeiten?
Stelle sicher, dass jede Validierungs-Art genug Struktur zurückgibt, damit die UI auf ein bestimmtes Eingabefeld reagieren kann. Für jeden Fehler gib field, einen stabilen code und eine menschenlesbare message zurück. Decke die gängigen DB-Fälle ab (unique, foreign key, NOT NULL, check). Technische Details gehören in die Logs, nicht an die Nutzer.
UI-Verhalten: Hilft es der Person, wieder handlungsfähig zu werden?
Selbst eine perfekte Meldung fühlt sich schlecht an, wenn das Formular gegen den Nutzer arbeitet. Fokussiere das erste fehlerhafte Feld und scrolle es bei Bedarf in den View. Bewahre, was der Nutzer bereits eingegeben hat (vor allem bei Mehrfachfehlern). Zeige Fehler zuerst feldbezogen, mit einer kurzen Zusammenfassung nur wenn sie hilft.
Logging und Tests: Fängst du Regressionen?
Constraint-Handling bricht oft still, wenn Schemata geändert werden. Behandle es wie ein gepflegtes Feature. Logge den DB-Fehler intern (Constraint-Name, Tabelle, Operation, Request-ID), aber zeige ihn niemals direkt an. Füge Tests für mindestens ein Beispiel pro Constraint-Typ hinzu und verifiziere, dass dein Mapping stabil bleibt, selbst wenn sich die genaue Datenbank-Formulierung ändert.
Nächste Schritte: Konsistenz in der ganzen App herstellen
Die meisten Teams beheben Constraint-Fehler Bildschirm für Bildschirm. Das hilft, aber Nutzer merken die Lücken: Ein Formular zeigt eine klare Meldung, ein anderes sagt noch „Request failed.“ Konsistenz verwandelt das von einem Hotfix in ein Muster.
Beginne dort, wo es am meisten wehtut. Ziehe eine Woche Logs oder Support-Tickets und wähle die Constraints aus, die immer wieder auftreten. Diese „Top-Übeltäter“ sollten zuerst freundliche, feldbezogene Meldungen bekommen.
Behandle Fehlerübersetzung wie ein kleines Produkt-Feature. Halte eine gemeinsame Mapping-Tabelle, die überall benutzt wird: Constraint-Name (oder Code) -> Feldname -> Meldung -> Wiederherstellungshinweis. Halte Meldungen schlicht und die Hinweise handlungsorientiert.
Ein leichtgewichtiger Rollout-Plan, der in einen vollen Produktzyklus passt:
- Identifiziere die 5 Constraints, die Nutzer am häufigsten treffen, und formuliere die exakten Meldungen.
- Füge eine Mapping-Tabelle hinzu und nutze sie in jedem Endpoint, der Daten speichert.
- Standardisiere, wie Formulare Fehler rendern (gleiche Platzierung, gleicher Ton, gleiches Fokus-Verhalten).
- Lass nicht-technische Kollegen die Meldungen lesen und frage: „Was würdest du als Nächstes tun?".
- Füge für jedes Formular einen Test hinzu, der prüft, dass das richtige Feld hervorgehoben wird und die Meldung lesbar ist.
Wenn du dieses konsistente Verhalten ohne Handarbeit für jede Ansicht bauen willst, unterstützt AppMaster (appmaster.io) Backend-APIs sowie generierte Web- und native Mobile-Apps. Das macht es einfacher, ein gemeinsames strukturiertes Fehlerformat über Clients hinweg zu nutzen, sodass feldbezogenes Feedback konsistent bleibt, wenn sich dein Datenmodell ändert.
Schreibe auch eine kurze „Fehlermeldungs‑Style“-Notiz für dein Team. Halte sie einfach: welche Wörter ihr vermeidet (Datenbankbegriffe) und was jede Meldung enthalten muss (was passiert ist, was als Nächstes zu tun ist).
FAQ
Behandle es wie normales Formular-Feedback, nicht als Systemabsturz. Zeige eine kurze Meldung neben genau dem Feld, das geändert werden muss, bewahre die Eingaben des Nutzers und erkläre in klarer Sprache den nächsten Schritt.
Ein feldbezogener Fehler zeigt auf ein bestimmtes Eingabefeld und sagt dem Nutzer, was er dort ändern soll, z. B. „E-Mail wird bereits verwendet.“ Eine generische Meldung zwingt zum Raten, zu wiederholten Versuchen oder zu Supportanfragen, weil sie nicht sagt, was zu ändern ist.
Nutze stabile Fehlercodes des Datenbank-Treibers, wenn möglich, und mappe sie dann auf nutzerfreundliche Typen wie unique, foreign key, required oder range-Regeln. Vermeide das Parsen roher Datenbanktexte, da diese sich zwischen Treibern, Versionen und Einstellungen ändern können.
Lege eine einfache Zuordnung vom Constraint-Namen auf den UI-Feldschlüssel im Backend fest, nahe am Code, der das Schema verwaltet. Beispiel: mappe einen Unique-Constraint auf email so, dass die UI das richtige Eingabefeld hervorheben kann, ohne raten zu müssen.
Standardisiere auf „Dieser Wert wird bereits verwendet“ und biete eine klare nächste Aktion wie „Anderes versuchen“ oder „Anmelden“ an, je nach Kontext. Bei Signup- oder Passwort-Reset-Flows verwende neutrale Formulierungen, um nicht die Existenz eines Kontos zu bestätigen.
Erkläre es als veraltete oder ungültige Auswahl, die der Nutzer erkennt, z. B. „Dieser Kunde existiert nicht mehr. Wähle einen anderen.“ Wenn der Nutzer ohne weiteres Erstellen eines zugehörigen Datensatzes nicht weiterkommt, biete im UI den Pfad zur Erstellung an, statt nur wiederholte Versuche zu verlangen.
Markiere Pflichtfelder in der UI und validiere vor dem Absenden, aber behandle den DB-Fehler als Sicherheitsnetz. Wenn es passiert, zeige eine einfache „Erforderlich“-Meldung am Feld und lass das restliche Formular intakt.
Gib ein Array von Fehlern zurück, jedes mit einem Feldschlüssel, einem stabilen Code und einer kurzen Nachricht, damit die UI alle gleichzeitig anzeigen kann. Auf der Client-Seite fokusiere das erste fehlerhafte Feld, aber zeige die anderen Meldungen ebenfalls, damit Nutzer nicht in einer „ein Fehler nach dem anderen“-Schleife stecken bleiben.
Nutze eine konsistente Payload, die trennt, was Nutzer sehen, und was du loggst. Zum Beispiel: eine nutzerfreundliche Nachricht plus interne Details wie Constraint-Name und Request-ID. Zeige niemals rohe SQL-Fehler an und lass die UI nicht Datenbankstrings parsen.
Zentralisiere die Übersetzung an einer Stelle im Backend, gib eine vorhersehbare Fehlerstruktur zurück und render diese in allen Formularen gleich. AppMaster ermöglicht es, denselben strukturierten Fehler-Contract in generierten Backend-APIs und Web/Mobile-Clients zu verwenden, damit Meldungen konsistent bleiben, wenn sich das Datenmodell ändert.


