{"id":47619,"date":"2022-01-28T15:19:40","date_gmt":"2022-01-28T14:19:40","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=47619&#038;preview=true&#038;preview_id=47619"},"modified":"2023-07-27T11:06:05","modified_gmt":"2023-07-27T10:06:05","slug":"fehlern-in-javascript","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/","title":{"rendered":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript"},"content":{"rendered":"<p>Murphys Gesetz besagt, dass alles, was schief gehen kann, auch schief gehen wird. Das trifft in der Welt der Programmierung nur allzu gut zu. Wenn du eine Anwendung erstellst, kann es passieren, dass du Fehler und andere Probleme verursachst. Fehler in JavaScript sind ein h\u00e4ufiges Problem!<\/p>\n<p>Der Erfolg eines Softwareprodukts h\u00e4ngt davon ab, wie gut es den Entwicklern gelingt, diese Probleme zu l\u00f6sen, bevor sie den Benutzern schaden. Und von allen <a href=\"https:\/\/kinsta.com\/de\/blog\/beste-programmiersprache-lernen-sollte\/\">Programmiersprachen<\/a> ist <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-javascript\/\">JavaScript<\/a> ber\u00fcchtigt f\u00fcr seine durchschnittliche Fehlerbehandlung.<\/p>\n<p>Wenn du <a href=\"https:\/\/kinsta.com\/de\/blog\/javascript-bibliotheken\/\">eine JavaScript-Anwendung entwick<\/a>elst, ist die Wahrscheinlichkeit gro\u00df, dass du an der einen oder anderen Stelle einen Fehler bei den Datentypen machst. Wenn das nicht der Fall ist, kann es passieren, dass du einen <i>undefinierten <\/i>Wert durch eine <i>Null<\/i> oder einen dreifachen Gleichheitsoperator (<code>===<\/code>) durch einen doppelten Gleichheitsoperator (<code>==<\/code>) ersetzt.<\/p>\n<p>Es ist nur menschlich, Fehler zu machen. Deshalb zeigen wir dir alles, was du \u00fcber den Umgang mit Fehlern in JavaScript wissen musst.<\/p>\n<p>Dieser Artikel f\u00fchrt dich durch die grundlegenden Fehler in JavaScript und erkl\u00e4rt die verschiedenen Fehler, die dir begegnen k\u00f6nnen. Anschlie\u00dfend erf\u00e4hrst du, wie du diese Fehler erkennen und beheben kannst. Au\u00dferdem haben wir\u00a0 ein paar Tipps, wie du Fehler in Produktionsumgebungen effektiv beheben kannst.<\/p>\n<p>Ohne Umschweife: Los geht&#8217;s!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h3>Schau dir unseren Video-Leitfaden zur <a href=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\">Behandlung von JavaScript-Fehlern<\/a> an<\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\"><\/kinsta-video>\n<h2>Was sind JavaScript-Fehler?<\/h2>\n<p>Als Fehler in der Programmierung werden Situationen bezeichnet, in denen ein Programm nicht normal funktioniert. Das kann passieren, wenn ein Programm nicht wei\u00df, wie es die anstehende Aufgabe bew\u00e4ltigen soll, z. B. wenn es versucht, eine nicht vorhandene Datei zu \u00f6ffnen oder einen webbasierten API-Endpunkt zu erreichen, obwohl keine Netzwerkverbindung besteht.<\/p>\n<p>In solchen Situationen gibt das Programm eine Fehlermeldung aus, die besagt, dass es nicht wei\u00df, wie es weitergehen soll. Das Programm sammelt so viele Informationen wie m\u00f6glich \u00fcber den Fehler und meldet dann, dass es nicht weitermachen kann.<\/p>\n\n<p>Intelligente Programmierer versuchen, diese Szenarien vorherzusehen und abzudecken, damit der Nutzer eine <a href=\"https:\/\/kinsta.com\/de\/blog\/http-statuscodes\/\">technische Fehlermeldung wie &#8222;404&#8220;<\/a> nicht selbst herausfinden muss. Stattdessen zeigen sie eine viel verst\u00e4ndlichere Meldung an: &#8222;Die Seite konnte nicht gefunden werden.&#8220;<\/p>\n<p>Fehler in JavaScript sind Objekte, die angezeigt werden, wenn ein Programmierfehler auftritt. Diese Objekte enthalten ausf\u00fchrliche Informationen \u00fcber die Art des Fehlers, die Anweisung, die den Fehler verursacht hat, und den Stack-Trace, als der Fehler auftrat. Mit JavaScript k\u00f6nnen Programmierer auch eigene Fehler erstellen, um zus\u00e4tzliche Informationen f\u00fcr die Fehlersuche zu erhalten.<\/p>\n<h3>Eigenschaften eines Fehlers<\/h3>\n<p>Nachdem die Definition eines JavaScript-Fehlers nun klar ist, ist es an der Zeit, sich mit den Details zu besch\u00e4ftigen.<\/p>\n<p>Fehler in JavaScript haben bestimmte Standard- und benutzerdefinierte Eigenschaften, die helfen, die Ursache und Auswirkungen des Fehlers zu verstehen. Standardm\u00e4\u00dfig enthalten Fehler in JavaScript drei Eigenschaften:<\/p>\n<ol>\n<li><b>nachricht<\/b>: Ein String-Wert, der die Fehlermeldung enth\u00e4lt<\/li>\n<li><b>name<\/b>: Die Art des Fehlers, der aufgetreten ist (wir werden im n\u00e4chsten Abschnitt n\u00e4her darauf eingehen)<\/li>\n<li><b>stack<\/b>: Der Stack-Trace des Codes, der ausgef\u00fchrt wurde, als der Fehler auftrat.<\/li>\n<\/ol>\n<p>Zus\u00e4tzlich k\u00f6nnen Fehler auch Eigenschaften wie <i>columnNumber, lineNumber, fileName <\/i>usw. enthalten, um den Fehler besser zu beschreiben. Diese Eigenschaften geh\u00f6ren jedoch nicht zum Standard und sind m\u00f6glicherweise nicht in jedem Fehlerobjekt vorhanden, das von deiner JavaScript-Anwendung erzeugt wird.<\/p>\n<h3>Stack Trace verstehen<\/h3>\n<p>Ein Stack Trace ist die Liste der Methodenaufrufe, in denen sich ein Programm befand, als ein Ereignis wie eine Ausnahme oder eine Warnung auftrat. So sieht ein Beispiel f\u00fcr einen Stack Trace mit einer Ausnahme aus:<\/p>\n<figure id=\"attachment_110237\" aria-describedby=\"caption-attachment-110237\" style=\"width: 1138px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110237 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-output-numeric.png\" alt=\"The error \u201cTypeError: Numeric argument is expected\u201d is shown on a gray background with additional stack details.\" width=\"1138\" height=\"278\"><figcaption id=\"caption-attachment-110237\" class=\"wp-caption-text\">Beispiel f\u00fcr einen Stack Trace.<\/figcaption><\/figure>\n<p>Wie du sehen kannst, werden zun\u00e4chst der Fehlername und die Fehlermeldung ausgegeben, gefolgt von einer Liste der Methoden, die aufgerufen wurden. F\u00fcr jeden Methodenaufruf werden die Stelle im Quellcode und die Zeile, in der er aufgerufen wurde, angegeben. Mit diesen Daten kannst du durch deine Codebasis navigieren und herausfinden, welcher Teil des Codes den Fehler verursacht.<\/p>\n<p>Diese Liste der Methoden ist \u00fcbereinander angeordnet. Sie zeigt, wo die Ausnahme zuerst ausgel\u00f6st wurde und wie sie sich durch die gestapelten Methodenaufrufe ausgebreitet hat. Wenn du eine Catch-Funktion f\u00fcr die Ausnahme implementierst, kann sie sich nicht \u00fcber den Stack ausbreiten und dein Programm zum Absturz bringen. Es kann jedoch vorkommen, dass du fatale Fehler absichtlich nicht abf\u00e4ngst, um das Programm in bestimmten Szenarien zum Absturz zu bringen.<\/p>\n<h3>Fehler vs. Ausnahmen<\/h3>\n<p>Die meisten Menschen betrachten Fehler und Ausnahmen als ein und dasselbe. Es gibt jedoch einen kleinen, aber grundlegenden Unterschied zwischen ihnen.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style- info\">\n        <p>Eine Ausnahme ist ein Fehlerobjekt, das ausgel\u00f6st wurde.<\/p>\n<\/aside>\n\n<p>Um das besser zu verstehen, lass uns ein kurzes Beispiel nehmen. Hier siehst du, wie du einen Fehler in JavaScript definieren kannst:<\/p>\n<pre><code class=\"language-js\">const wrongTypeError = TypeError(\"Wrong type found, expected character\")<code><\/code><\/code><\/pre>\n<p>Und so wird das <code><i>wrongTypeError<\/i><\/code> objekt zu einer Ausnahme:<\/p>\n<pre><code class=\"language-js\">throw wrongTypeError<\/code><\/pre>\n<p>Die meisten Leute neigen jedoch dazu, die Kurzform zu verwenden, die Fehlerobjekte definiert, w\u00e4hrend sie geworfen werden:<\/p>\n<pre><code class=\"language-js\">throw TypeError(\"Wrong type found, expected character\")<\/code><\/pre>\n<p>Das ist eine g\u00e4ngige Praxis. Das ist jedoch einer der Gr\u00fcnde, warum Entwickler dazu neigen, Ausnahmen und Fehler zu verwechseln. Deshalb ist es wichtig, die Grundlagen zu kennen, auch wenn du die Kurzschrift benutzt, um deine Arbeit schnell zu erledigen.<\/p>\n<h2>Arten von Fehlern in JavaScript<\/h2>\n<p>Es gibt eine Reihe von vordefinierten Fehlertypen in JavaScript. Sie werden automatisch von der JavaScript-Laufzeitumgebung ausgew\u00e4hlt und definiert, wenn der Programmierer Fehler in der Anwendung nicht explizit behandelt.<\/p>\n<p>In diesem Abschnitt lernst du einige der h\u00e4ufigsten Fehlerarten in JavaScript kennen und erf\u00e4hrst, wann und warum sie auftreten.<\/p>\n<h3>RangeError<\/h3>\n<p>Ein RangeError wird ausgel\u00f6st, wenn eine Variable mit einem Wert gesetzt wird, der au\u00dferhalb ihres zul\u00e4ssigen Wertebereichs liegt. Er tritt normalerweise auf, wenn ein Wert als Argument an eine Funktion \u00fcbergeben wird und der angegebene Wert nicht im Bereich der Funktionsparameter liegt. Bei der Verwendung von schlecht dokumentierten Bibliotheken von Drittanbietern kann es manchmal schwierig sein, diesen Fehler zu beheben, da du den Bereich der m\u00f6glichen Werte f\u00fcr die Argumente kennen musst, um den richtigen Wert zu \u00fcbergeben.<\/p>\n<p>Einige der h\u00e4ufigsten Szenarien, in denen RangeError auftritt, sind:<\/p>\n<ul>\n<li>Der Versuch, ein Array mit unzul\u00e4ssiger L\u00e4nge \u00fcber den Array-Konstruktor zu erstellen.<\/li>\n<li>\u00dcbergabe falscher Werte an numerische Methoden wie <code>toExponential()<\/code>, <code>toPrecision()<\/code>, <code>toFixed()<\/code>, etc.<\/li>\n<li>\u00dcbergabe von unzul\u00e4ssigen Werten an String-Funktionen wie <code>normalize()<\/code>.<\/li>\n<\/ul>\n<h3>ReferenceError<\/h3>\n<p>Ein ReferenceError tritt auf, wenn etwas mit der Referenz einer Variablen in deinem Code nicht stimmt. Vielleicht hast du vergessen, einen Wert f\u00fcr die Variable zu definieren, bevor du sie benutzt, oder du versuchst, eine unzug\u00e4ngliche Variable in deinem Code zu verwenden. In jedem Fall liefert der Stacktrace gen\u00fcgend Informationen, um die fehlerhafte Variablenreferenz zu finden und zu beheben.<\/p>\n<p>Einige der h\u00e4ufigsten Gr\u00fcnde, warum ReferenceErrors auftreten, sind:<\/p>\n<ul>\n<li>Ein Tippfehler in einem Variablennamen.<\/li>\n<li>Der Versuch, auf Block-Scoped-Variablen au\u00dferhalb ihres Scopes zuzugreifen.<\/li>\n<li>Verweis auf eine globale Variable aus einer externen Bibliothek (z. B. <a href=\"https:\/\/kinsta.com\/de\/blog\/jquery-ist-nicht-definiert\/\">$ aus jQuery<\/a>), bevor sie geladen wurde.<\/li>\n<\/ul>\n<h3>SyntaxError<\/h3>\n<p>Diese Fehler sind mit am einfachsten zu beheben, da sie auf einen Fehler in der Syntax des Codes hinweisen. Da JavaScript eine <a href=\"https:\/\/kinsta.com\/de\/blog\/skriptsprachen\/\">Skriptsprache<\/a> ist, die interpretiert und nicht kompiliert wird, werden diese Fehler ausgel\u00f6st, wenn die App das Skript ausf\u00fchrt, das den Fehler enth\u00e4lt. Bei kompilierten Sprachen werden solche Fehler w\u00e4hrend der Kompilierung erkannt. Daher werden die Bin\u00e4rdateien der App erst erstellt, wenn sie behoben sind.<\/p>\n<p>Einige der h\u00e4ufigsten Gr\u00fcnde, warum SyntaxErrors auftreten k\u00f6nnen, sind:<\/p>\n<ul>\n<li>Fehlende Anf\u00fchrungszeichen<\/li>\n<li>Fehlende schlie\u00dfende Klammern<\/li>\n<li>Falsche Ausrichtung von geschweiften Klammern oder anderen Zeichen<\/li>\n<\/ul>\n<p>Es ist eine gute Praxis, ein Linting-Tool in deiner IDE zu verwenden, um solche Fehler zu erkennen, bevor sie im Browser erscheinen.<\/p>\n<h3>TypeError<\/h3>\n<p>TypeError ist einer der h\u00e4ufigsten Fehler in JavaScript-Anwendungen. Dieser Fehler tritt auf, wenn ein Wert nicht dem erwarteten Typ entspricht. Einige der h\u00e4ufigsten F\u00e4lle, in denen er auftritt, sind:<\/p>\n<ul>\n<li>Aufrufen von Objekten, die keine Methoden sind.<\/li>\n<li>Der Versuch, auf Eigenschaften von null oder undefinierten Objekten zuzugreifen<\/li>\n<li>Behandlung einer Zeichenkette als Zahl oder andersherum<\/li>\n<\/ul>\n<p>Es gibt noch viel mehr M\u00f6glichkeiten, wo ein TypeError auftreten kann. Wir werden uns sp\u00e4ter einige bekannte F\u00e4lle ansehen und lernen, wie man sie beheben kann.<\/p>\n<h3>InternalError<\/h3>\n<p>Der Typ InternalError wird verwendet, wenn eine Ausnahme in der JavaScript-Laufzeit-Engine auftritt. Das kann auf ein Problem in deinem Code hindeuten, muss es aber nicht.<\/p>\n<p>In den meisten F\u00e4llen tritt InternalError nur in zwei Szenarien auf:<\/p>\n<ul>\n<li>Wenn ein Patch oder ein Update f\u00fcr die JavaScript-Laufzeitumgebung einen Fehler enth\u00e4lt, der Ausnahmen ausl\u00f6st (dies kommt sehr selten vor)<\/li>\n<li>Wenn dein Code Elemente enth\u00e4lt, die f\u00fcr die JavaScript-Engine zu gro\u00df sind (z. B. zu viele Switch-Cases, zu gro\u00dfe Array-Initialisierungen, zu viele Rekursionen)<\/li>\n<\/ul>\n<p>Der beste Ansatz zur L\u00f6sung dieses Fehlers besteht darin, die Ursache anhand der Fehlermeldung zu identifizieren und deine App-Logik nach M\u00f6glichkeit umzustrukturieren, um die pl\u00f6tzliche Belastungsspitze der JavaScript-Engine zu beseitigen.<\/p>\n<h3>URIError<\/h3>\n<p>URIError tritt auf, wenn eine globale URI-Verarbeitungsfunktion wie <code>decodeURIComponent<\/code> unrechtm\u00e4\u00dfig verwendet wird. Er zeigt in der Regel an, dass der an den Methodenaufruf \u00fcbergebene Parameter nicht den URI-Standards entspricht und daher <a href=\"https:\/\/kinsta.com\/de\/blog\/parsen-von-javascript-verzogert\/\">von der Methode nicht richtig geparst<\/a> wurde.<\/p>\n<p>Die Diagnose dieser Fehler ist in der Regel einfach, da du nur die Argumente auf Fehler untersuchen musst.<\/p>\n<h3>EvalError<\/h3>\n<p>Ein EvalError tritt auf, wenn ein Fehler bei einem <code>eval()<\/code> Funktionsaufruf auftritt. Die Funktion <code>eval()<\/code> wird verwendet, um in Zeichenketten gespeicherten JavaScript-Code auszuf\u00fchren. Da jedoch von der Verwendung der Funktion <code>eval()<\/code> aus Sicherheitsgr\u00fcnden dringend abgeraten wird und die aktuellen ECMAScript-Spezifikationen die Klasse <code>EvalError<\/code> nicht mehr ausl\u00f6sen, gibt es diesen Fehlertyp nur, um die Abw\u00e4rtskompatibilit\u00e4t mit altem JavaScript-Code zu wahren.<\/p>\n<p>Wenn du mit einer \u00e4lteren Version von JavaScript arbeitest, kann es sein, dass du auf diesen Fehler st\u00f6\u00dft. In jedem Fall ist es am besten, den Code des <code>eval()<\/code> Funktionsaufrufs auf Ausnahmen zu untersuchen.<\/p>\n<h2>Benutzerdefinierte Fehlertypen erstellen<\/h2>\n<p>JavaScript bietet zwar eine ausreichende Liste von Fehlertypklassen, die die meisten Szenarien abdecken, aber du kannst jederzeit einen neuen Fehlertyp erstellen, wenn die Liste deine Anforderungen nicht erf\u00fcllt. Die Grundlage f\u00fcr diese Flexibilit\u00e4t liegt in der Tatsache, dass JavaScript es dir erlaubt, mit dem Befehl <code>throw<\/code> buchst\u00e4blich alles zu werfen.<\/p>\n<p>Technisch gesehen sind diese Anweisungen also v\u00f6llig legal:<\/p>\n<pre><code class=\"language-js\">throw 8\nthrow \"An error occurred\"<\/code><\/pre>\n<p>Das ausgeben eines primitiven Datentyps liefert jedoch keine Details \u00fcber den Fehler, wie z. B. den Typ, den Namen oder den zugeh\u00f6rigen Stack-Trace. Um dies zu beheben und die Fehlerbehandlung zu standardisieren, wurde die Klasse <code>Error<\/code> eingef\u00fchrt. Es wird auch davon abgeraten, primitive Datentypen beim Ausl\u00f6sen von Ausnahmen zu verwenden.<\/p>\n<p>Du kannst die Klasse <code>Error<\/code> erweitern, um deine eigene Fehlerklasse zu erstellen. Hier ist ein einfaches Beispiel daf\u00fcr, wie du das machen kannst:<\/p>\n<pre><code class=\"language-js\">class ValidationError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"ValidationError\";\n    }\n}<\/code><\/pre>\n<p>Du kannst die Klasse auf folgende Weise verwenden:<\/p>\n<pre><code class=\"language-js\">throw ValidationError(\"Property not found: name\")<\/code><\/pre>\n<p>Und du kannst es dann mit dem Schl\u00fcsselwort <code>instanceof<\/code> identifizieren:<\/p>\n<pre><code class=\"language-js\">try {\n    validateForm() \/\/ code that throws a ValidationError\n} catch (e) {\n    if (e instanceof ValidationError)\n    \/\/ do something\n    else\n    \/\/ do something else\n}<\/code><\/pre>\n<h2>Top 10 der h\u00e4ufigsten Fehler in JavaScript<\/h2>\n<p>Jetzt, wo du die g\u00e4ngigen Fehlertypen kennst und wei\u00dft, wie du deine eigenen erstellen kannst, ist es an der Zeit, dir einige der h\u00e4ufigsten Fehler anzusehen, mit denen du beim Schreiben von JavaScript-Code konfrontiert wirst.<\/p>\n<h3>Schau dir unseren Video-Leitfaden zu den <a href=\"https:\/\/www.youtube.com\/watch?v=IXrqv7Szv_g\">h\u00e4ufigsten JavaScript-Fehlern<\/a> an<\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=IXrqv7Szv_g\"><\/kinsta-video>\n<h3>1. Uncaught RangeError<\/h3>\n<p>Dieser Fehler tritt in Google Chrome unter verschiedenen Umst\u00e4nden auf. Zun\u00e4chst kann er auftreten, wenn du eine rekursive Funktion aufrufst und diese nicht beendet wird. Du kannst dies selbst in der Chrome Developer Console \u00fcberpr\u00fcfen:<\/p>\n<figure id=\"attachment_110241\" aria-describedby=\"caption-attachment-110241\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110241 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/recur-range-error.png\" alt=\"The error \u201cUncaught RangeError: Maximum call stack size exceeded\u201d is shown on a red background beside a red cross icon with a recursive function\u2019s code above it.\" width=\"1392\" height=\"492\"><figcaption id=\"caption-attachment-110241\" class=\"wp-caption-text\">RangeError Beispiel mit einem rekursiven Funktionsaufruf.<\/figcaption><\/figure>\n<p>Um einen solchen Fehler zu beheben, musst du sicherstellen, dass du die Grenzf\u00e4lle deiner rekursiven Funktion richtig definierst. Ein weiterer Grund, warum dieser Fehler auftritt, ist, wenn du einen Wert \u00fcbergeben hast, der au\u00dferhalb des Parameterbereichs einer Funktion liegt. Hier ist ein Beispiel:<\/p>\n<figure id=\"attachment_110239\" aria-describedby=\"caption-attachment-110239\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110239 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-range-error.png\" alt=\"The error \u201cUncaught RangeError: toExponential() argument must be between 0 and 100\u201d is shown on a red background beside a red cross icon with a toExponential() function call above it.\" width=\"1392\" height=\"150\"><figcaption id=\"caption-attachment-110239\" class=\"wp-caption-text\">RangeError Beispiel mit toExponential() Aufruf.<\/figcaption><\/figure>\n<p>Die Fehlermeldung zeigt normalerweise an, was in deinem Code falsch ist. Sobald du die \u00c4nderungen vornimmst, wird der Fehler behoben sein.<\/p>\n<figure id=\"attachment_110240\" aria-describedby=\"caption-attachment-110240\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110240 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-error-fixed.png\" alt=\"num = 4. num.toExponential(2). Output: 4.00e+0.\" width=\"1396\" height=\"100\"><figcaption id=\"caption-attachment-110240\" class=\"wp-caption-text\">Ausgabe f\u00fcr den Funktionsaufruf toExponential().<\/figcaption><\/figure>\n<h3>2. Uncaught TypeError: Cannot set property<\/h3>\n<p>Dieser Fehler tritt auf, wenn du eine Eigenschaft auf eine undefinierte Referenz setzt. Du kannst das Problem mit diesem Code reproduzieren:<\/p>\n<pre><code class=\"language-js\">var list\nlist.count = 0<code><\/code><\/code><\/pre>\n<p>Hier ist die Ausgabe, die du erhalten wirst:<\/p>\n<figure id=\"attachment_110245\" aria-describedby=\"caption-attachment-110245\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110245 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot set properties of undefined\u201d is shown on a red background beside a red cross icon with a list.count = 0 assignment above it.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110245\" class=\"wp-caption-text\">TypeError Beispiel.<\/figcaption><\/figure>\n<p>Um diesen Fehler zu beheben, initialisiere die Referenz mit einem Wert, bevor du auf ihre Eigenschaften zugreifst. So sieht es aus, wenn er behoben ist:<\/p>\n<figure id=\"attachment_110246\" aria-describedby=\"caption-attachment-110246\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110246 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-fixed.png\" alt=\"Setting list.count = 10 after initializing list with {} due to which the output is 10.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110246\" class=\"wp-caption-text\">Wie man TypeError behebt.<\/figcaption><\/figure>\n<h3>3. Uncaught TypeError: Cannot read property<\/h3>\n<p>Dies ist einer der am h\u00e4ufigsten auftretenden Fehler in JavaScript. Dieser Fehler tritt auf, wenn du versuchst, eine Eigenschaft zu lesen oder eine Funktion f\u00fcr ein undefiniertes Objekt aufzurufen. Du kannst ihn ganz einfach reproduzieren, indem du den folgenden Code in der Chrome Developer Konsole ausf\u00fchrst:<\/p>\n<pre><code class=\"language-js\">var func\nfunc.call()<code><\/code><\/code><\/pre>\n<p>Hier ist die Ausgabe:<\/p>\n<figure id=\"attachment_110249\" aria-describedby=\"caption-attachment-110249\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110249 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot read properties of undefined\u201d is shown on a red background beside a red cross icon with func.call() above it.\" width=\"1100\" height=\"162\"><figcaption id=\"caption-attachment-110249\" class=\"wp-caption-text\">TypeError Beispiel mit undefinierter Funktion.<\/figcaption><\/figure>\n<p>Ein undefiniertes Objekt ist eine der vielen m\u00f6glichen Ursachen f\u00fcr diesen Fehler. Eine weitere Ursache kann eine falsche Initialisierung des Zustands beim Rendern der Benutzeroberfl\u00e4che sein. Hier ist ein praktisches Beispiel aus einer React-Anwendung:<\/p>\n<pre><code class=\"language-js\">import React, { useState, useEffect } from \"react\";\n\nconst CardsList = () =&gt; {\n\n    const [state, setState] = useState();\n\n    useEffect(() =&gt; {\n        setTimeout(() =&gt; setState({ items: [\"Card 1\", \"Card 2\"] }), 2000);\n    }, []);\n\n    return (\n        &lt;&gt;\n            {state.items.map((item) =&gt; (\n                &lt;li key={item}&gt;{item}&lt;\/li&gt;\n            ))}\n        &lt;\/&gt;\n    );\n};\n\nexport default CardsList;<\/code><\/pre>\n<p>Die Anwendung startet mit einem leeren Zustandscontainer und wird nach einer Verz\u00f6gerung von 2 Sekunden mit einigen Elementen versorgt. Die Verz\u00f6gerung wurde eingebaut, um einen Netzwerkaufruf zu imitieren. Selbst wenn dein Netzwerk superschnell ist, wirst du mit einer kleinen Verz\u00f6gerung rechnen m\u00fcssen, durch die die Komponente mindestens einmal gerendert wird. Wenn du versuchst, diese App auszuf\u00fchren, erh\u00e4ltst du die folgende Fehlermeldung:<\/p>\n<figure id=\"attachment_110234\" aria-describedby=\"caption-attachment-110234\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110234 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/undefined-type-error-output.png\" alt=\"The error \u201cundefined is not an object\u201d is shown on a grey background.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110234\" class=\"wp-caption-text\">TypeError Stack Trace in einem Browser.<\/figcaption><\/figure>\n<p>Das liegt daran, dass der Zustandscontainer zum Zeitpunkt des Renderns undefiniert ist; es gibt also keine Eigenschaft <code>items<\/code> f\u00fcr ihn. Diesen Fehler zu beheben ist einfach. Du musst dem Zustandscontainer nur einen Standardwert zuweisen.<\/p>\n<pre><code class=\"language-js\">\/\/ ...\nconst [state, setState] = useState({items: []});\n\/\/ ...<\/code><\/pre>\n<p>Nach der eingestellten Verz\u00f6gerung wird deine App nun eine \u00e4hnliche Ausgabe zeigen:<\/p>\n<figure id=\"attachment_110251\" aria-describedby=\"caption-attachment-110251\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110251 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/cards-list-output.png\" alt=\"A bulleted list with two items reading \"Card 1\" and \"Card 2\".\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110251\" class=\"wp-caption-text\">Codeausgabe.<\/figcaption><\/figure>\n<p>Die genaue L\u00f6sung in deinem Code k\u00f6nnte anders aussehen, aber das Wichtigste ist, dass du deine Variablen immer richtig initialisierst, bevor du sie benutzt.<\/p>\n<h3>4. TypeError: &#8218;undefined&#8216; ist kein Objekt<\/h3>\n<p>Dieser Fehler tritt in Safari auf, wenn du versuchst, auf die Eigenschaften eines undefinierten Objekts zuzugreifen oder eine Methode aufzurufen. Du kannst den gleichen Code wie oben ausf\u00fchren, um den Fehler selbst zu reproduzieren.<\/p>\n<figure id=\"attachment_110250\" aria-describedby=\"caption-attachment-110250\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110250 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error-undefined.png\" alt=\"The error \u201cTypeError: undefined is not an object\u201d shown on a red background beside a red exclamation point icon with func.call() method call above it.\" width=\"1146\" height=\"172\"><figcaption id=\"caption-attachment-110250\" class=\"wp-caption-text\">TypeError Beispiel mit undefinierter Funktion.<\/figcaption><\/figure>\n<p>Die L\u00f6sung f\u00fcr diesen Fehler ist ebenfalls dieselbe &#8211; stelle sicher, dass du deine Variablen richtig initialisiert hast und sie nicht undefiniert sind, wenn auf eine Eigenschaft oder Methode zugegriffen wird.<\/p>\n<h3>5. TypeError: null ist kein Objekt<\/h3>\n<p>Auch dieser Fehler ist \u00e4hnlich wie der vorherige. Er tritt bei Safari auf. Der einzige Unterschied zwischen den beiden Fehlern ist, dass dieser Fehler ausgel\u00f6st wird, wenn das Objekt, auf dessen Eigenschaft oder Methode zugegriffen wird, <code>null<\/code> und nicht <code>undefined<\/code> ist. Du kannst diesen Fehler reproduzieren, indem du den folgenden Code ausf\u00fchrst:<\/p>\n<pre><code class=\"language-js\">var func = null\n\nfunc.call()<\/code><\/pre>\n<p>Hier ist die Ausgabe, die du erhalten wirst:<\/p>\n<figure id=\"attachment_110243\" aria-describedby=\"caption-attachment-110243\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110243 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/null-object-error.png\" alt=\"The \"TypeError: null is not an object\" error message, shown on a red background beside a red exclamation point icon.\" width=\"1146\" height=\"142\"><figcaption id=\"caption-attachment-110243\" class=\"wp-caption-text\">TypeError Beispiel mit Null-Funktion.<\/figcaption><\/figure>\n<p>Da <code>null<\/code> ein Wert ist, der explizit auf eine Variable gesetzt wird und nicht automatisch von JavaScript zugewiesen wird. Dieser Fehler kann nur auftreten, wenn du versuchst, auf eine Variable zuzugreifen, die du <code>null<\/code> selbst gesetzt hast. Du musst also deinen Code \u00fcberarbeiten und \u00fcberpr\u00fcfen, ob die Logik, die du geschrieben hast, korrekt ist.<\/p>\n<h3>6. TypeError: Eigenschaft &#8218;length&#8216; kann nicht gelesen werden<\/h3>\n<p>Dieser Fehler tritt in Chrome auf, wenn du versuchst, die L\u00e4nge eines <code>null<\/code> oder <code>undefined<\/code> Objekts zu lesen. Die Ursache f\u00fcr dieses Problem ist \u00e4hnlich wie bei den vorherigen Problemen, aber es tritt recht h\u00e4ufig beim Umgang mit Listen auf und verdient daher eine besondere Erw\u00e4hnung. Hier erf\u00e4hrst du, wie du das Problem reproduzieren kannst:<\/p>\n<figure id=\"attachment_110244\" aria-describedby=\"caption-attachment-110244\" style=\"width: 937px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110244 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/myButton-length-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot read property 'length' of undefined\u201d shown on a red background beside a red cross icon with myButton.length call above it.\" width=\"937\" height=\"230\"><figcaption id=\"caption-attachment-110244\" class=\"wp-caption-text\">TypeError Beispiel mit einem undefinierten Objekt.<\/figcaption><\/figure>\n<p>In den neueren Versionen von Chrome wird dieser Fehler jedoch als <code>Uncaught TypeError: Cannot read properties of undefined<\/code> gemeldet. So sieht es jetzt aus:<\/p>\n<figure id=\"attachment_110247\" aria-describedby=\"caption-attachment-110247\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110247 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/length-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot read properties of undefined\u201d shown on a red background beside a red cross icon with myButton.length call above it.\" width=\"1400\" height=\"174\"><figcaption id=\"caption-attachment-110247\" class=\"wp-caption-text\">TypeError-Beispiel mit einem undefinierten Objekt in neueren Chrome-Versionen.<\/figcaption><\/figure>\n<p>Die L\u00f6sung besteht wiederum darin, sicherzustellen, dass das Objekt, auf dessen L\u00e4nge du zugreifen willst, existiert und nicht auf <code>null<\/code> gesetzt ist.<\/p>\n<h3>7. TypeError: &#8218;undefined&#8216; ist keine Funktion<\/h3>\n<p>Dieser Fehler tritt auf, wenn du versuchst, eine Methode aufzurufen, die es in deinem Skript nicht gibt oder die zwar existiert, aber im aufrufenden Kontext nicht referenziert werden kann. Dieser Fehler tritt normalerweise in Google Chrome auf und du kannst ihn l\u00f6sen, indem du die Codezeile \u00fcberpr\u00fcfst, die den Fehler verursacht. Wenn du einen Tippfehler findest, korrigiere ihn und pr\u00fcfe, ob dein Problem dadurch gel\u00f6st wird.<\/p>\n<p>Wenn du das selbstreferenzierende Schl\u00fcsselwort <code>this<\/code> in deinem Code verwendet hast, kann dieser Fehler auftreten, wenn <code>this<\/code> nicht ordnungsgem\u00e4\u00df an deinen Kontext gebunden ist. Betrachte den folgenden Code:<\/p>\n<pre><code class=\"language-js\">function showAlert() {\n    alert(\"message here\")\n}\n\ndocument.addEventListener(\"click\", () =&gt; {\n    this.showAlert();\n})<\/code><\/pre>\n<p>Wenn du den obigen Code ausf\u00fchrst, wird er den besprochenen Fehler ausl\u00f6sen. Das liegt daran, dass die anonyme Funktion, die als Ereignis-Listener \u00fcbergeben wird, im Kontext von <code>document<\/code> ausgef\u00fchrt wird.<\/p>\n<p>Im Gegensatz dazu ist die Funktion <code>showAlert<\/code> im Kontext der <code>window<\/code> definiert.<\/p>\n<p>Um dieses Problem zu l\u00f6sen, musst du die richtige Referenz auf die Funktion \u00fcbergeben, indem du sie mit der Methode <code>bind()<\/code> bindest:<\/p>\n<pre><code class=\"language-js\">document.addEventListener(\"click\", this.showAlert.bind(this))<\/code><\/pre>\n<h3>8. ReferenceError: event is not defined<\/h3>\n<p>Dieser Fehler tritt auf, wenn du versuchst, auf eine Referenz zuzugreifen, die im aufrufenden Bereich nicht definiert ist. Das passiert in der Regel beim Umgang mit Ereignissen, da sie dir in der Callback-Funktion oft eine Referenz namens <code>event<\/code> zur Verf\u00fcgung stellen. Dieser Fehler kann auftreten, wenn du vergisst, das Ereignisargument in den Parametern deiner Funktion zu definieren oder es falsch schreibst.<\/p>\n<p>Im Internet Explorer und in Google Chrome tritt dieser Fehler zwar nicht auf (da der IE eine globale Ereignisvariable anbietet und Chrome die Ereignisvariable automatisch an den Handler anh\u00e4ngt), aber in Firefox kann er auftreten. Es ist also ratsam, nach solchen kleinen Fehlern Ausschau zu halten.<\/p>\n<h3>9. TypeError: Zuweisung an konstante Variable<\/h3>\n<p>Dies ist ein Fehler, der aus Unachtsamkeit entsteht. Wenn du versuchst, einer konstanten Variablen einen neuen Wert zuzuweisen, wirst du mit einem solchen Ergebnis konfrontiert:<\/p>\n<figure id=\"attachment_110248\" aria-describedby=\"caption-attachment-110248\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110248 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-type-error.png\" alt=\"The error \u201cUncaught TypeError: Assignment to constant variable\u201d shown on a red background beside a red cross icon with func = 6 assignment above it.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110248\" class=\"wp-caption-text\">TypeError Beispiel mit konstanter Objektzuweisung.<\/figcaption><\/figure>\n<p>Auch wenn es im Moment einfach zu beheben scheint, stell dir vor, du hast hunderte solcher Variablendeklarationen und eine davon ist f\u00e4lschlicherweise als <code>const<\/code> statt als <code>let<\/code> definiert! <a href=\"https:\/\/kinsta.com\/de\/blog\/php-vs-javascript\/#variable-and-constant-definitions\">Im Gegensatz zu anderen Skriptsprachen wie PHP<\/a> gibt es in JavaScript nur minimale Unterschiede bei der Deklaration von Konstanten und Variablen. Deshalb ist es ratsam, deine Deklarationen zuerst zu \u00fcberpr\u00fcfen, wenn du diesen Fehler siehst. Dieser Fehler kann auch auftreten, wenn du<i> vergisst<\/i>, dass die besagte Referenz eine Konstante ist und sie als Variable benutzt. Das deutet entweder auf Unachtsamkeit oder einen Fehler in der Logik deiner Anwendung hin. \u00dcberpr\u00fcfe das unbedingt, wenn du versuchst, dieses Problem zu beheben.<\/p>\n<h3>10. (unbekannt): Skript-Fehler<\/h3>\n<p>Ein Skriptfehler tritt auf, wenn ein Skript eines Drittanbieters einen Fehler an deinen Browser sendet. Dieser Fehler wird von <i>(unbekannt)<\/i> gefolgt <i>, weil<\/i> das Skript eines Drittanbieters zu einer anderen Domain geh\u00f6rt als deine App. Der Browser verbirgt andere Details, um zu verhindern, dass sensible Informationen vom Skript des Drittanbieters durchsickern.<\/p>\n<p>Du kannst diesen Fehler nicht beheben, ohne die vollst\u00e4ndigen Details zu kennen. Hier ist, was du tun kannst, um mehr Informationen \u00fcber den Fehler zu erhalten:<\/p>\n<ol>\n<li>F\u00fcge das Attribut <code>crossorigin<\/code> in das Skript-Tag ein.<\/li>\n<li>Setze den richtigen <code>Access-Control-Allow-Origin<\/code> Header auf dem Server, der das Skript hostet.<\/li>\n<li>[Optional] Wenn du keinen Zugriff auf den Server hast, auf dem das Skript gehostet wird, kannst du einen Proxy verwenden, der deine Anfrage an den Server weiterleitet und mit den richtigen Headern an den Client zur\u00fcckschickt.<\/li>\n<\/ol>\n<p>Sobald du die Details des Fehlers kennst, kannst du dich daran machen, das Problem zu beheben, das wahrscheinlich entweder mit der Bibliothek des Drittanbieters oder dem Netzwerk zusammenh\u00e4ngt.<\/p>\n<h2>Wie du Fehler in JavaScript erkennst und vermeidest<\/h2>\n<p>Auch wenn die oben genannten Fehler die h\u00e4ufigsten sind, auf die du in JavaScript sto\u00dfen wirst, reicht es nie aus, sich auf ein paar Beispiele zu verlassen. Es ist wichtig zu wissen, wie du bei der Entwicklung einer JavaScript-Anwendung alle Arten von Fehlern erkennen und verhindern kannst. Hier erf\u00e4hrst du, wie du mit Fehlern in JavaScript umgehen kannst.<\/p>\n<h3>Manuelles Ausgeben und L\u00f6sen von Fehlern<\/h3>\n<p>Die grundlegendste Art, mit Fehlern umzugehen, die entweder manuell oder von der Laufzeit ausgel\u00f6st wurden, ist, sie abzufangen. Wie die meisten anderen Sprachen bietet auch JavaScript eine Reihe von Schl\u00fcsselw\u00f6rtern zur Fehlerbehebung. Es ist wichtig, dass du jedes dieser Schl\u00fcsselw\u00f6rter genau kennst, bevor du dich daran machst, Fehler in deiner JavaScript-App zu beheben.<\/p>\n<h4>throw<\/h4>\n<p>Das erste und grundlegendste Schl\u00fcsselwort der Gruppe ist <code>throw<\/code>. Wie du siehst, wird das throw-Schl\u00fcsselwort verwendet, um Fehler auszul\u00f6sen und manuell Ausnahmen in der JavaScript-Laufzeit zu erzeugen. Wir haben dies bereits weiter oben in diesem Artikel besprochen, und hier ist die Bedeutung dieses Schl\u00fcsselworts im Wesentlichen:<\/p>\n<ul>\n<li>Du kannst <code>throw<\/code> alles geben, auch Zahlen, Strings und <code>Error<\/code> Objekte.<\/li>\n<li>Es ist jedoch nicht ratsam, primitive Datentypen wie Strings und Zahlen zu nehmen, da sie keine Debug-Informationen \u00fcber die Fehler enthalten.<\/li>\n<li>Beispiel <code>throw TypeError(\"Please provide a string\")<\/code><\/li>\n<\/ul>\n<h4>try<\/h4>\n<p>Das Schl\u00fcsselwort <code>try<\/code> wird verwendet, um anzuzeigen, dass ein Codeblock eine Ausnahme ausl\u00f6sen k\u00f6nnte. Seine Syntax lautet:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ error-prone code here\n}<\/code><\/pre>\n<p>Es ist wichtig zu beachten, dass ein <code>catch<\/code> Block immer auf den <code>try<\/code> Block folgen muss, um Fehler effektiv zu behandeln.<\/p>\n<h4>catch<\/h4>\n<p>Das Schl\u00fcsselwort <code>catch<\/code> wird verwendet, um einen catch-Block zu erstellen. Dieser Codeblock ist f\u00fcr die Behandlung von Fehlern zust\u00e4ndig, die der nachfolgende <code>try<\/code> Block auff\u00e4ngt. Hier ist seine Syntax:<\/p>\n<pre><code class=\"language-js\">catch (exception) {\n    \/\/ code to handle the exception here\n}<\/code><\/pre>\n<p>Und so implementierst du die Bl\u00f6cke <code>try<\/code> und <code>catch<\/code> zusammen:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    \/\/ error handling code\n}<\/code><\/pre>\n<p>Anders als in C++ oder Java kannst du in JavaScript nicht mehrere <code>catch<\/code> Bl\u00f6cke an einen <code>try<\/code> Block anh\u00e4ngen. Das bedeutet, dass du das nicht tun kannst:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    }\n} catch (exception) {\n    if (exception instanceof RangeError) {\n    \/\/ do something\n    }\n}<\/code><\/pre>\n<p>Stattdessen kannst du eine <code>if...else<\/code> Anweisung oder eine switch case Anweisung innerhalb des einzelnen catch-Blocks verwenden, um alle m\u00f6glichen Fehlerf\u00e4lle zu behandeln. Das w\u00fcrde dann so aussehen:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    } else if (exception instanceof RangeError) {\n        \/\/ do something else\n    }\n}<\/code><\/pre>\n<h4>finally<\/h4>\n<p>Das Schl\u00fcsselwort <code>finally<\/code> wird verwendet, um einen Codeblock zu definieren, der ausgef\u00fchrt wird, nachdem ein Fehler behandelt worden ist. Dieser Block wird nach den try- und catch-Bl\u00f6cken ausgef\u00fchrt.<\/p>\n<p>Au\u00dferdem wird der finally-Block unabh\u00e4ngig vom Ergebnis der anderen beiden Bl\u00f6cke ausgef\u00fchrt. Das bedeutet, dass der Interpreter den Code im finally-Block ausf\u00fchrt, bevor das Programm abst\u00fcrzt, selbst wenn der catch-Block den Fehler nicht vollst\u00e4ndig behandeln kann oder ein Fehler im catch-Block ausgel\u00f6st wird.<\/p>\n<p>Um als g\u00fcltig zu gelten, muss auf den try-Block in JavaScript entweder ein catch- oder ein finally-Block folgen. Ohne einen dieser Bl\u00f6cke l\u00f6st der Interpreter einen SyntaxError aus. Achte deshalb darauf, dass du deinen try-Bl\u00f6cken mindestens einen dieser beiden Bl\u00f6cke folgen l\u00e4sst, wenn du Fehler behandelst.<\/p>\n<h3>Globale Fehlerbehandlung mit der Methode onerror()<\/h3>\n<p>Die Methode <code>onerror()<\/code> steht f\u00fcr alle HTML-Elemente zur Verf\u00fcgung, um Fehler zu behandeln, die bei ihnen auftreten k\u00f6nnen. Wenn zum Beispiel ein <code>img<\/code> -Tag das Bild, dessen URL angegeben ist, nicht finden kann, wird seine onerror-Methode ausgel\u00f6st, damit der Benutzer den Fehler behandeln kann.<\/p>\n<p>Normalerweise w\u00fcrdest du im onerror-Aufruf eine andere Bild-URL angeben, auf die der <code>img<\/code> -Tag zur\u00fcckgreifen kann. So kannst du das mit JavaScript machen:<\/p>\n<pre><code class=\"language-js\">const image = document.querySelector(\"img\")\n\nimage.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Du kannst diese Funktion aber auch nutzen, um einen globalen Fehlerbehandlungsmechanismus f\u00fcr deine App zu erstellen. So kannst du das tun:<\/p>\n<pre><code class=\"language-js\">window.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Mit diesem Event-Handler kannst du dich von den vielen <code>try...catch<\/code> Bl\u00f6cken in deinem Code befreien und die Fehlerbehandlung in deiner App \u00e4hnlich wie die Ereignisbehandlung zentralisieren. Du kannst mehrere Fehlerhandler an das Fenster anh\u00e4ngen, um das Single-Responsibility-Prinzip aus den SOLID-Designprinzipien zu wahren. Der Interpreter wird alle Handler durchlaufen, bis er den richtigen erreicht.<\/p>\n<h3>\u00dcbergabe von Fehlern \u00fcber Callbacks<\/h3>\n<p>W\u00e4hrend einfache und lineare Funktionen eine einfache Fehlerbehebung erm\u00f6glichen, k\u00f6nnen R\u00fcckrufe die Angelegenheit verkomplizieren.<\/p>\n<p>Betrachte das folgende St\u00fcck Code:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n    setTimeout(() =&gt; {\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ncalculateCube(4, callback)<\/code><\/pre>\n<p>Die obige Funktion demonstriert einen asynchronen Zustand, in dem eine Funktion einige Zeit braucht, um Operationen zu verarbeiten und das Ergebnis sp\u00e4ter mit Hilfe eines R\u00fcckrufs zur\u00fcckgibt.<\/p>\n<p>Wenn du versuchst, in den Funktionsaufruf eine Zeichenkette anstelle von 4 einzugeben, erh\u00e4ltst du als Ergebnis <code>NaN<\/code>.<\/p>\n<p>Das muss richtig gehandhabt werden. So geht&#8217;s:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\")\n            throw new Error(\"Numeric argument is expected\")\n\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ntry {\n    calculateCube(4, callback)\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>Damit sollte das Problem im Idealfall gel\u00f6st sein. Wenn du jedoch versuchst, eine Zeichenkette an den Funktionsaufruf zu \u00fcbergeben, bekommst du Folgendes zu sehen:<\/p>\n<figure id=\"attachment_110236\" aria-describedby=\"caption-attachment-110236\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110236 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric-argument.png\" alt=\"The error \u201cUncaught Error: Numeric argument is expected\u201d shown on a dark red background beside a red cross icon.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110236\" class=\"wp-caption-text\">Fehlerbeispiel mit dem falschen Argument.<\/figcaption><\/figure>\n<p>Obwohl du beim Aufruf der Funktion einen try-catch-Block implementiert hast, hei\u00dft es immer noch, der Fehler sei nicht gefunden. Der Fehler wird aufgrund der Timeout-Verz\u00f6gerung erst nach der Ausf\u00fchrung des catch-Blocks ausgel\u00f6st.<\/p>\n<p>Das kann bei Netzwerkaufrufen schnell passieren, wenn sich unerwartete Verz\u00f6gerungen einschleichen. Du musst solche F\u00e4lle bei der Entwicklung deiner App abdecken.<\/p>\n<p>Hier erf\u00e4hrst du, wie du Fehler in Callbacks richtig beheben kannst:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\") {\n            callback(new TypeError(\"Numeric argument is expected\"))\n            return\n        }\n        const cube = number * number * number\n        callback(null, cube)\n    }, 2000)\n}\n\nconst callback = (error, result) =&gt; {\n    if (error !== null) {\n        console.log(error)\n        return\n    }\n    console.log(result)\n}\n\ntry {\n    calculateCube('hey', callback)\n} catch (e) {\n    console.log(e)\n}<\/code><\/pre>\n<p>Die Ausgabe auf der Konsole wird nun sein:<\/p>\n<figure id=\"attachment_110238\" aria-describedby=\"caption-attachment-110238\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110238 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-numeric-dark.png\" alt=\"The message \u201cTypeError: Numeric argument is expected\u201d shown on a dark grey background.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110238\" class=\"wp-caption-text\">TypeError Beispiel mit illegalem Argument.<\/figcaption><\/figure>\n<p>Dies zeigt an, dass der Fehler angemessen behandelt wurde.<\/p>\n<h3>Fehler in Promises behandeln<\/h3>\n<p>Die meisten Menschen bevorzugen Promises f\u00fcr die Behandlung asynchroner Aktivit\u00e4ten. Promises haben einen weiteren Vorteil &#8211; ein abgelehntes Promise beendet dein Skript nicht. Trotzdem musst du einen catch-Block implementieren, um Fehler in Promises zu behandeln. Um das besser zu verstehen, wollen wir die Funktion <code>calculateCube()<\/code> mit Promises umschreiben:<\/p>\n<pre><code class=\"language-js\">const delay = ms =&gt; new Promise(res =&gt; setTimeout(res, ms));\n\nconst calculateCube = async (number) =&gt; {\n    if (typeof number !== \"number\")\n        throw Error(\"Numeric argument is expected\")\n    await delay(5000)\n    const cube = number * number * number\n    return cube\n}\n\ntry {\n    calculateCube(4).then(r =&gt; console.log(r))\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>Die Zeit\u00fcberschreitung aus dem vorherigen Code wurde zum besseren Verst\u00e4ndnis in die Funktion <code>delay<\/code> ausgelagert. Wenn du versuchst, eine Zeichenkette statt 4 einzugeben, bekommst du eine \u00e4hnliche Ausgabe wie diese:<\/p>\n<figure id=\"attachment_110235\" aria-describedby=\"caption-attachment-110235\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110235 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric.png\" alt=\"The error \u201cUncaught (in promise) Error: Numeric argument is expected\u201d shown on a dark grey background beside a red cross icon.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110235\" class=\"wp-caption-text\">TypeError Beispiel mit einem illegalen Argument in Promise.<\/figcaption><\/figure>\n<p>Auch hier liegt es daran, dass <code>Promise<\/code> den Fehler ausl\u00f6st, nachdem alles andere bereits ausgef\u00fchrt wurde. Die L\u00f6sung f\u00fcr dieses Problem ist einfach. F\u00fcge der Promise-Kette einfach einen <code>catch()<\/code> -Aufruf wie folgt hinzu:<\/p>\n<pre><code class=\"language-js\">calculateCube(\"hey\")\n.then(r =&gt; console.log(r))\n.catch(e =&gt; console.log(e))<\/code><\/pre>\n<p>Jetzt lautet die Ausgabe:<\/p>\n<figure id=\"attachment_110242\" aria-describedby=\"caption-attachment-110242\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110242 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/numeric-argument-error.png\" alt=\"The message \u201cError: Numeric argument is expected\u201d shown on a dark grey background.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110242\" class=\"wp-caption-text\">Handled TypeError example with illegal argument.<\/figcaption><\/figure>\n<p>Du kannst sehen, wie einfach es ist, Fehler mit Versprechen zu behandeln. Au\u00dferdem kannst du einen <code>finally()<\/code> Block und den Aufruf des Versprechens verketten, um Code hinzuzuf\u00fcgen, der nach Abschluss der Fehlerbehandlung ausgef\u00fchrt wird.<\/p>\n<p>Alternativ kannst du Fehler in Versprechen auch mit der traditionellen try-catch-finally-Technik behandeln. So w\u00fcrde dein Versprechensaufruf in diesem Fall aussehen:<\/p>\n<pre><code class=\"language-js\">try {\n    let result = await calculateCube(\"hey\")\n    console.log(result)\n} catch (e) {\n    console.log(e)\n} finally {\n    console.log('Finally executed\")\n}<\/code><\/pre>\n<p>Dies funktioniert jedoch nur innerhalb einer asynchronen Funktion. Daher ist die bevorzugte Methode zur Behandlung von Fehlern in Versprechen die Verkettung von <code>catch<\/code> und <code>finally<\/code> mit dem Aufruf des Versprechens.<\/p>\n<h3>throw\/catch vs onerror() vs Callbacks vs Promises: Was ist das Beste?<\/h3>\n<p>Da dir vier Methoden zur Verf\u00fcgung stehen, musst du wissen, wie du die am besten geeignete f\u00fcr einen bestimmten Anwendungsfall ausw\u00e4hlen kannst. Im Folgenden erf\u00e4hrst du, wie du das f\u00fcr dich entscheiden kannst:<\/p>\n<h4>throw\/catch<\/h4>\n<p>Diese Methode wirst du die meiste Zeit verwenden. Achte darauf, dass du in deinem Catch-Block Bedingungen f\u00fcr alle m\u00f6glichen Fehler implementierst, und vergiss nicht, einen Finally-Block einzuf\u00fcgen, wenn du nach dem Try-Block einige Speicherbereinigungsroutinen ausf\u00fchren musst.<\/p>\n<p>Zu viele try\/catch-Bl\u00f6cke k\u00f6nnen jedoch dazu f\u00fchren, dass dein Code schwer zu pflegen ist. Wenn du dich in einer solchen Situation befindest, solltest du Fehler \u00fcber den globalen Handler oder die promise-Methode beheben.<\/p>\n<p>Bei der Entscheidung zwischen asynchronen try\/catch-Bl\u00f6cken und dem Versprechen <code>catch()<\/code> ist es ratsam, sich f\u00fcr die asynchronen try\/catch-Bl\u00f6cke zu entscheiden, da sie deinen Code linear und leicht zu debuggen machen.<\/p>\n<h4>onerror()<\/h4>\n<p>Die Methode <code>onerror()<\/code> ist am besten geeignet, wenn du wei\u00dft, dass deine App viele Fehler behandeln muss und diese \u00fcber die gesamte Codebasis verstreut sein k\u00f6nnen. Die Methode <code>onerror<\/code> erm\u00f6glicht es dir, Fehler so zu behandeln, als w\u00e4ren sie ein weiteres Ereignis, das von deiner Anwendung behandelt wird. Du kannst mehrere Fehlerhandler definieren und sie beim ersten Rendering an das Fenster deiner Anwendung anh\u00e4ngen.<\/p>\n<p>Du musst aber auch bedenken, dass die <code>onerror()<\/code> Methode in kleineren Projekten mit geringerer Fehleranf\u00e4lligkeit unn\u00f6tig schwierig einzurichten sein kann. Wenn du dir sicher bist, dass deine App nicht zu viele Fehler ausl\u00f6st, ist die traditionelle throw\/catch-Methode am besten f\u00fcr dich geeignet.<\/p>\n<h4>Callbacks und Promises<\/h4>\n<p>Die Fehlerbehandlung in Callbacks und Promises unterscheidet sich aufgrund ihres Codedesigns und ihrer Struktur. Wenn du dich jedoch zwischen diesen beiden entscheiden musst, bevor du deinen Code geschrieben hast, ist es am besten, sich f\u00fcr Promises zu entscheiden.<\/p>\n<p>Das liegt daran, dass Versprechen ein eingebautes Konstrukt zur Verkettung eines <code>catch()<\/code> und eines <code>finally()<\/code> Blocks haben, um Fehler einfach zu behandeln. Diese Methode ist einfacher und sauberer als die Definition zus\u00e4tzlicher Argumente oder die Wiederverwendung vorhandener Argumente zur Fehlerbehandlung.<\/p>\n<h3>\u00c4nderungen mit Git Repositories nachverfolgen<\/h3>\n<p>Viele Fehler entstehen oft durch manuelle Fehler in der Codebasis. Beim Entwickeln oder Debuggen deines Codes kann es passieren, dass du unn\u00f6tige \u00c4nderungen vornimmst, die zu neuen Fehlern in deiner Codebasis f\u00fchren k\u00f6nnen. <a href=\"https:\/\/kinsta.com\/de\/docs\/wordpress-hosting\/wordpress-referenz\/technische-faq\/\">Automatisierte Tests<\/a> sind eine gute M\u00f6glichkeit, um deinen Code nach jeder \u00c4nderung zu \u00fcberpr\u00fcfen. Sie k\u00f6nnen dir aber nur sagen, ob etwas falsch ist. Wenn du nicht regelm\u00e4\u00dfig Sicherungskopien deines Codes erstellst, verschwendest du Zeit mit dem Versuch, eine Funktion oder ein Skript zu reparieren, das vorher einwandfrei funktioniert hat.<\/p>\n<p>An dieser Stelle kommt Git ins Spiel. Mit einer guten Commit-Strategie kannst du deine Git-Historie als Backup-System nutzen, um deinen Code im Laufe der Entwicklung zu betrachten. Du kannst ganz einfach durch deine \u00e4lteren Commits bl\u00e4ttern und herausfinden, welche Version der Funktion vorher einwandfrei funktionierte, aber nach einer \u00c4nderung, die nichts mit dem Code zu tun hat, Fehler ausl\u00f6st.<\/p>\n<p>Du kannst dann den alten Code wiederherstellen oder die beiden Versionen vergleichen, um herauszufinden, was falsch gelaufen ist. Moderne <a href=\"https:\/\/kinsta.com\/de\/blog\/webentwicklung-tools\/\">Webentwicklungs-Tools<\/a> wie <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-github\/\">GitHub<\/a> Desktop oder GitKraken helfen dir, diese \u00c4nderungen nebeneinander zu sehen und die Fehler schnell zu finden.<\/p>\n<p>Eine Gewohnheit, die dir helfen kann, weniger Fehler zu machen, ist die Durchf\u00fchrung von <a href=\"https:\/\/kinsta.com\/de\/blog\/code-review-tools\/\">Code-Reviews<\/a> bei jeder gr\u00f6\u00dferen \u00c4nderung an deinem Code. Wenn du in einem Team arbeitest, kannst du einen Pull Request erstellen und ihn von einem Teammitglied gr\u00fcndlich \u00fcberpr\u00fcfen lassen. So hast du ein zweites Paar Augen, um Fehler zu entdecken, die dir vielleicht entgangen sind.<\/p>\n<h2>Best Practices f\u00fcr den Umgang mit Fehlern in JavaScript<\/h2>\n<p>Die oben genannten Methoden sind ausreichend, um eine robuste Fehlerbehandlung f\u00fcr deine n\u00e4chste JavaScript-Anwendung zu entwickeln. Allerdings solltest du bei der Umsetzung ein paar Dinge beachten, um das Beste aus deiner Fehlersicherung herauszuholen. Hier sind einige Tipps, die dir dabei helfen.<\/p>\n<h3>1. Verwende benutzerdefinierte Fehler bei der Behandlung von Betriebsausnahmen<\/h3>\n<p>Wir haben benutzerdefinierte Fehler zu Beginn dieses Leitfadens eingef\u00fchrt, um dir eine Vorstellung davon zu geben, wie du die Fehlerbehebung an den speziellen Fall deiner Anwendung anpassen kannst. Es ist ratsam, wann immer m\u00f6glich benutzerdefinierte Fehler anstelle der generischen Klasse <code>Error<\/code> zu verwenden, da sie der aufrufenden Umgebung mehr kontextbezogene Informationen \u00fcber den Fehler liefern.<\/p>\n<p>Au\u00dferdem kannst du mit benutzerdefinierten Fehlern festlegen, wie ein Fehler in der aufrufenden Umgebung angezeigt wird. Das bedeutet, dass du bestimmte Details ausblenden oder zus\u00e4tzliche Informationen \u00fcber den Fehler anzeigen lassen kannst, wie und wann du willst.<\/p>\n<p>Du kannst sogar so weit gehen, dass du den Inhalt des Fehlers nach deinen W\u00fcnschen formatierst. So hast du eine bessere Kontrolle dar\u00fcber, wie der Fehler interpretiert und behandelt wird.<\/p>\n<h3>2. Keine Ausnahmen machen<\/h3>\n<p>Selbst die erfahrensten Entwickler machen oft einen Anf\u00e4ngerfehler &#8211; sie machen Ausnahmen tief in ihrem Code.<\/p>\n<p>Du k\u00f6nntest in Situationen kommen, in denen du ein St\u00fcck Code hast, das optional ausgef\u00fchrt werden soll. Wenn er funktioniert, ist das toll; wenn nicht, brauchst du nichts zu tun.<\/p>\n<p>In solchen F\u00e4llen ist es oft verlockend, den Code in einen Try-Block zu packen und einen leeren Catch-Block daran zu h\u00e4ngen. Auf diese Weise l\u00e4sst du jedoch zu, dass dieser Code <i>einen<\/i> Fehler verursacht und damit davonkommt. Das kann gef\u00e4hrlich werden, wenn du eine gro\u00dfe Codebasis und viele Instanzen solcher schlechten Fehlermanagement-Konstrukte hast.<\/p>\n<p>Der beste Weg, mit Ausnahmen umzugehen, besteht darin, eine Ebene zu bestimmen, auf der alle Ausnahmen behandelt werden, und sie bis dorthin aufzuheben. Diese Ebene kann ein Controller (in einer MVC-Architektur) oder eine Middleware (in einer traditionellen serverorientierten App) sein.<\/p>\n<p>Auf diese Weise erf\u00e4hrst du, wo du alle in deiner App auftretenden Fehler findest und wie du sie beheben kannst, auch wenn das bedeutet, dass du nichts dagegen tun kannst.<\/p>\n<h3>3. Verwende eine zentrale Strategie f\u00fcr Logs und Fehlerwarnungen<\/h3>\n<p>Die Protokollierung eines Fehlers ist oft ein wesentlicher Bestandteil der Fehlerbehandlung. Wer keine zentrale Strategie f\u00fcr die Protokollierung von Fehlern entwickelt, dem entgehen m\u00f6glicherweise wertvolle Informationen \u00fcber die Nutzung seiner App.<\/p>\n<p>Die Ereignisprotokolle einer App k\u00f6nnen dir helfen, wichtige Daten \u00fcber Fehler herauszufinden und sie schnell zu beheben. Wenn du in deiner App geeignete Warnmechanismen eingerichtet hast, kannst du wissen, wenn ein Fehler in deiner App auftritt, bevor er einen gro\u00dfen Teil deiner Nutzer\/innen erreicht.<\/p>\n<p>Es ist ratsam, einen vorgefertigten Logger zu verwenden oder einen zu erstellen, der deinen Bed\u00fcrfnissen entspricht. Du kannst diesen Logger so konfigurieren, dass er Fehler je nach Stufe behandelt (Warnung, Debug, Info usw.), und manche Logger gehen sogar so weit, dass sie die Protokolle sofort an entfernte Logging-Server senden. Auf diese Weise kannst du beobachten, wie sich die Logik deiner Anwendung bei aktiven Nutzern verh\u00e4lt.<\/p>\n<h3>4. Benutzer angemessen \u00fcber Fehler benachrichtigen<\/h3>\n<p>Ein weiterer wichtiger Punkt, den du bei der Festlegung deiner Strategie f\u00fcr die Fehlerbehandlung beachten solltest, ist, dass du den Nutzer nicht aus den Augen verlierst.<\/p>\n<p>Alle Fehler, die das normale Funktionieren deiner App beeintr\u00e4chtigen, m\u00fcssen dem Nutzer eine sichtbare Warnung geben, um ihn darauf hinzuweisen, dass etwas schief gelaufen ist, damit er versuchen kann, eine L\u00f6sung zu finden. Wenn du eine schnelle L\u00f6sung f\u00fcr den Fehler kennst, wie z. B. einen Vorgang erneut zu versuchen oder dich ab- und wieder anzumelden, solltest du dies in der Meldung erw\u00e4hnen, damit der Fehler in Echtzeit behoben werden kann.<\/p>\n<p>Bei Fehlern, die den normalen Betrieb nicht beeintr\u00e4chtigen, kannst du die Meldung unterdr\u00fccken und den Fehler auf einem Remote-Server speichern, um ihn sp\u00e4ter zu beheben.<\/p>\n<h3>5. Implementiere eine Middleware (Node.js)<\/h3>\n<p>Die <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-node-js\/\">Node.js-Umgebung<\/a> unterst\u00fctzt Middlewares, um Funktionen zu Serveranwendungen hinzuzuf\u00fcgen. Du kannst diese Funktion nutzen, um eine Middleware zur Fehlerbehandlung f\u00fcr deinen Server zu erstellen.<\/p>\n<p>Der gr\u00f6\u00dfte Vorteil der Middleware ist, dass alle Fehler zentral an einer Stelle behandelt werden. Du kannst diese Einrichtung zu Testzwecken einfach aktivieren\/deaktivieren.<\/p>\n<p>Hier erf\u00e4hrst du, wie du eine einfache Middleware erstellen kannst:<\/p>\n<pre><code class=\"language-js\">const logError = err =&gt; {\n    console.log(\"ERROR: \" + String(err))\n}\n\nconst errorLoggerMiddleware = (err, req, res, next) =&gt; {\n    logError(err)\n    next(err)\n}\n\nconst returnErrorMiddleware = (err, req, res, next) =&gt; {\n    res.status(err.statusCode || 500)\n       .send(err.message)\n}\n\nmodule.exports = {\n    logError,\n    errorLoggerMiddleware,\n    returnErrorMiddleware\n}<\/code><\/pre>\n<p>Du kannst diese Middleware dann wie folgt in deiner App verwenden:<\/p>\n<pre><code class=\"language-js\">const { errorLoggerMiddleware, returnErrorMiddleware } = require('.\/errorMiddleware')\n\napp.use(errorLoggerMiddleware)\n\napp.use(returnErrorMiddleware)<\/code><\/pre>\n<p>Du kannst nun eigene Logik innerhalb der Middleware definieren, um Fehler angemessen zu behandeln. Du musst dich nicht mehr darum k\u00fcmmern, einzelne Konstrukte zur Fehlerbehandlung in deiner Codebasis zu implementieren.<\/p>\n<h3>6. Neustart deiner App zur Behandlung von Programmierfehlern (Node.js)<\/h3>\n<p>Wenn Node.js-Apps auf Programmierfehler sto\u00dfen, m\u00fcssen sie nicht unbedingt eine Ausnahme ausl\u00f6sen und versuchen, die App zu schlie\u00dfen. Solche Fehler k\u00f6nnen aus Programmierfehlern resultieren, wie z. B. ein hoher CPU-Verbrauch, Speicheraufbl\u00e4hung oder Speicherlecks. Der beste Weg, damit umzugehen, ist ein eleganter Neustart der App, indem du sie \u00fcber den Node.js-Cluster-Modus oder ein spezielles Tool wie PM2 zum Absturz bringst. So kannst du sicherstellen, dass die App nicht bei einer Benutzeraktion abst\u00fcrzt und ein schlechtes Benutzererlebnis bietet.<\/p>\n<h3>7. Catch All Uncaught Exceptions (Node.js)<\/h3>\n<p>Du kannst nie sicher sein, dass du alle m\u00f6glichen Fehler, die in deiner App auftreten k\u00f6nnen, abgedeckt hast. Deshalb ist es wichtig, dass du eine R\u00fcckfallstrategie implementierst, um alle nicht abgefangenen Ausnahmen deiner App abzufangen.<\/p>\n<p>Hier erf\u00e4hrst du, wie du das machen kannst:<\/p>\n<pre><code class=\"language-js\">process.on('uncaughtException', error =&gt; {\n    console.log(\"ERROR: \" + String(error))\n    \/\/ other handling mechanisms\n})<\/code><\/pre>\n<p>Du kannst auch feststellen, ob es sich bei dem aufgetretenen Fehler um eine Standardausnahme oder um einen benutzerdefinierten Betriebsfehler handelt. Anhand des Ergebnisses kannst du den Prozess beenden und ihn neu starten, um unerwartetes Verhalten zu vermeiden.<\/p>\n<h3>8. Alle unbehandelten Promise-Abweisungen abfangen (Node.js)<\/h3>\n<p>\u00c4hnlich wie du nie alle m\u00f6glichen Ausnahmen abfangen kannst, ist die Wahrscheinlichkeit gro\u00df, dass du es verpasst, alle m\u00f6glichen Ablehnungen von Versprechen zu behandeln. Im Gegensatz zu Ausnahmen werden bei Ablehnungen von Versprechen jedoch keine Fehler ausgel\u00f6st.<\/p>\n<p>Ein wichtiges Versprechen, das abgelehnt wurde, k\u00f6nnte also als Warnung \u00fcbersehen werden und deine App k\u00f6nnte auf ein unerwartetes Verhalten sto\u00dfen. Deshalb ist es wichtig, einen Fallback-Mechanismus f\u00fcr den Umgang mit Ablehnungen von Versprechen zu implementieren.<\/p>\n<p>Hier erf\u00e4hrst du, wie du das machen kannst:<\/p>\n<pre><code class=\"language-js\">const promiseRejectionCallback = error =&gt; {\n    console.log(\"PROMISE REJECTED: \" + String(error))\n}\n\nprocess.on('unhandledRejection', callback)<\/code><\/pre>\n\n<h2>Zusammenfassung<\/h2>\n<p>Wie in jeder anderen Programmiersprache sind Fehler auch in JavaScript recht h\u00e4ufig und nat\u00fcrlich. In manchen F\u00e4llen musst du sogar absichtlich Fehler ausl\u00f6sen, um deinen Benutzern die richtige Antwort zu geben. Daher ist es sehr wichtig, ihre Anatomie und Typen zu verstehen.<\/p>\n<p>Au\u00dferdem musst du mit den richtigen Werkzeugen und Techniken ausgestattet sein, um Fehler zu erkennen und zu verhindern, dass sie deine Anwendung zum Absturz bringen.<\/p>\n<p>In den meisten F\u00e4llen reicht eine solide Strategie zum Umgang mit Fehlern bei sorgf\u00e4ltiger Ausf\u00fchrung f\u00fcr alle Arten von JavaScript-Anwendungen aus.<\/p>\n<p><em>Gibt es noch andere JavaScript-Fehler, die du noch nicht l\u00f6sen konntest? Gibt es Techniken f\u00fcr den konstruktiven Umgang mit JS-Fehlern? Lass es uns in den Kommentaren unten wissen!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Murphys Gesetz besagt, dass alles, was schief gehen kann, auch schief gehen wird. Das trifft in der Welt der Programmierung nur allzu gut zu. Wenn du &#8230;<\/p>\n","protected":false},"author":238,"featured_media":47620,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[420,465,28],"topic":[950],"class_list":["post-47619","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-development","tag-javascript","tag-webdev","topic-javascript-fehler"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript<\/title>\n<meta name=\"description\" content=\"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript\" \/>\n<meta property=\"og:description\" content=\"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-28T14:19:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-27T10:06:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kumar Harsh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"32\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript\",\"datePublished\":\"2022-01-28T14:19:40+00:00\",\"dateModified\":\"2023-07-27T10:06:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\"},\"wordCount\":6246,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg\",\"keywords\":[\"development\",\"JavaScript\",\"webdev\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\",\"name\":\"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg\",\"datePublished\":\"2022-01-28T14:19:40+00:00\",\"dateModified\":\"2023-07-27T10:06:05+00:00\",\"description\":\"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg\",\"width\":1460,\"height\":730,\"caption\":\"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Javascript-Fehler\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/javascript-fehler\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"caption\":\"Kumar Harsh\"},\"description\":\"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.\",\"sameAs\":[\"https:\/\/kumarharsh.me\"],\"url\":\"https:\/\/kinsta.com\/de\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript","description":"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/","og_locale":"de_DE","og_type":"article","og_title":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript","og_description":"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.","og_url":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2022-01-28T14:19:40+00:00","article_modified_time":"2023-07-27T10:06:05+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Kumar Harsh","Gesch\u00e4tzte Lesezeit":"32\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript","datePublished":"2022-01-28T14:19:40+00:00","dateModified":"2023-07-27T10:06:05+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/"},"wordCount":6246,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg","keywords":["development","JavaScript","webdev"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/","url":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/","name":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg","datePublished":"2022-01-28T14:19:40+00:00","dateModified":"2023-07-27T10:06:05+00:00","description":"Du stolperst \u00fcber Fehler in deinem JavaScript? Wir zeigen dir, wie du diese Fehler in den Griff bekommst und dich auf dein Projekt konzentrieren kannst.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2022\/01\/errors-in-javascript.jpg","width":1460,"height":730,"caption":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/fehlern-in-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"Javascript-Fehler","item":"https:\/\/kinsta.com\/de\/thema\/javascript-fehler\/"},{"@type":"ListItem","position":3,"name":"Der ultimative Leitfaden f\u00fcr den Umgang mit Fehlern in JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","caption":"Kumar Harsh"},"description":"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.","sameAs":["https:\/\/kumarharsh.me"],"url":"https:\/\/kinsta.com\/de\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/47619","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=47619"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/47619\/revisions"}],"predecessor-version":[{"id":53806,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/47619\/revisions\/53806"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/de"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/translations\/jp"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/47619\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/47620"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=47619"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=47619"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=47619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}