﻿1
00:00:01,100 --> 00:00:02,750
‫Lehrer: Lassen Sie uns

2
00:00:02,750 --> 00:00:05,470
‫in diesem Video nun eine bessere und nützlichere Fehlerklasse

3
00:00:05,470 --> 00:00:07,373
‫erstellen und auch einige Umgestaltungen vornehmen.

4
00:00:09,210 --> 00:00:11,870
‫Und beginnend mit dieser Fehlerklasse

5
00:00:11,870 --> 00:00:15,053
‫erstellen wir eine neue Datei in unserem Utilities-Ordner.

6
00:00:15,950 --> 00:00:18,990
‫Also, neue Datei, und ich nenne

7
00:00:20,980 --> 00:00:25,820
‫sie AppError, weil das der Name der Klasse sein wird, in Ordnung?

8
00:00:25,820 --> 00:00:30,820
‫Also, Klasse AppError, und wir wollen eigentlich, dass alle

9
00:00:30,867 --> 00:00:34,780
‫unsere AppError-Objekte dann vom eingebauten Fehler

10
00:00:34,780 --> 00:00:39,260
‫erben, und lassen uns also die eingebaute Fehlerklasse erweitern.

11
00:00:39,260 --> 00:00:43,720
‫Also haben wir Extended Error verwendet, okay?

12
00:00:43,720 --> 00:00:46,870
‫Also, das haben wir schon mal irgendwo in

13
00:00:46,870 --> 00:00:50,950
‫diesem Kurs gemacht, und das sind wieder nur ES6-Kurse, in Ordnung?

14
00:00:50,950 --> 00:00:52,920
‫In diesem Fall Klassenvererbung,

15
00:00:52,920 --> 00:00:56,790
‫bei der eine Klasse von der anderen erbt, okay?

16
00:00:56,790 --> 00:00:59,300
‫Dann, wie immer, unser Konstruktor, und

17
00:00:59,300 --> 00:01:01,800
‫was wir an ein neues

18
00:01:01,800 --> 00:01:04,490
‫Objekt übergeben, das aus der AppError-Klasse

19
00:01:04,490 --> 00:01:08,660
‫erstellt wurde, sind die Nachricht und der StatusCode, also nur

20
00:01:08,660 --> 00:01:09,853
‫diese beiden.

21
00:01:11,330 --> 00:01:15,130
‫Denken Sie daran, dass die Konstruktormethode jedes Mal aufgerufen

22
00:01:15,130 --> 00:01:19,210
‫wird, wenn wir ein neues Objekt aus dieser Klasse erstellen.

23
00:01:19,210 --> 00:01:22,116
‫Nun, wie üblich, wenn wir eine

24
00:01:22,116 --> 00:01:25,760
‫Elternklasse erweitern, rufen wir super auf, um den Elternkonstruktor

25
00:01:25,760 --> 00:01:28,203
‫aufzurufen, in Ordnung, und wir

26
00:01:30,100 --> 00:01:33,580
‫tun dies mit message, weil die Nachricht tatsächlich

27
00:01:33,580 --> 00:01:37,160
‫der einzige Parameter ist, den der eingebaute Fehler akzeptiert.

28
00:01:37,160 --> 00:01:40,990
‫Okay, im Grunde rufen Sie also Fehler auf,

29
00:01:40,990 --> 00:01:44,305
‫in Ordnung, und dann ist das

30
00:01:44,305 --> 00:01:46,160
‫hier das Übliche,

31
00:01:48,300 --> 00:01:53,030
‫wir setzen den statusCode auf statusCode, in Ordnung, und jetzt

32
00:01:53,030 --> 00:01:56,463
‫wollen wir auch den Status selbst setzen.

33
00:01:58,200 --> 00:02:01,670
‫Denken Sie also daran, dass der Status entweder fehlgeschlagen oder fehlerhaft sein

34
00:02:01,670 --> 00:02:03,920
‫kann, und wir könnten dies an das

35
00:02:03,920 --> 00:02:05,700
‫Objekt übergeben, aber es ist

36
00:02:05,700 --> 00:02:08,530
‫auch nicht wirklich notwendig, da der Status vom statusCode abhängt.

37
00:02:08,530 --> 00:02:10,880
‫Wenn also der statusCode eine 400 ist, dann

38
00:02:10,880 --> 00:02:12,630
‫ist der Status fehlgeschlagen,

39
00:02:12,630 --> 00:02:16,230
‫und wenn es eine 500 ist, dann wird es ein Fehler sein,

40
00:02:16,230 --> 00:02:18,336
‫richtig, und so wird einfach getestet, ob

41
00:02:18,336 --> 00:02:20,420
‫der statusCode mit einer Vier beginnt.

42
00:02:20,420 --> 00:02:23,800
‫In JavaScript gibt es also eine MethodestartsWith,

43
00:02:23,800 --> 00:02:25,540
‫die wir

44
00:02:25,540 --> 00:02:28,100
‫für Strings aufrufen können, und

45
00:02:28,100 --> 00:02:31,363
‫ich denke, dies ist der einfachste Weg,

46
00:02:32,780 --> 00:02:35,610
‫diesen Test durchzuführen Template-String mit dem

47
00:02:35,610 --> 00:02:38,030
‫Code drin, also dies, oder

48
00:02:38,030 --> 00:02:40,380
‫wir können einfach statusCode verwenden.

49
00:02:41,781 --> 00:02:42,614
‫Also, statusCode

50
00:02:47,001 --> 00:02:48,750
‫und dann beginntWith, dann brauchen wir

51
00:02:48,750 --> 00:02:51,120
‫auch hier einen String, und wenn also der statusCode

52
00:02:51,120 --> 00:02:54,330
‫als String mit einer Vier beginnt, nun, dann haben wir einen Fehler.

53
00:02:54,330 --> 00:02:58,360
‫Also hier, lassen Sie uns die Ternär verwenden, okay,

54
00:02:58,360 --> 00:03:02,120
‫und so ist es fehlgeschlagen, wenn es

55
00:03:02,120 --> 00:03:06,890
‫mit einer 4 beginnt, und ansonsten ist es ein Fehler, okay?

56
00:03:06,890 --> 00:03:09,550
‫Also, sehr einfach, und das erspart

57
00:03:09,550 --> 00:03:13,250
‫uns bereits das manuelle Eingeben von Fehlern oder Fehlern.

58
00:03:13,250 --> 00:03:15,240
‫Alles klar, als nächstes werden

59
00:03:15,240 --> 00:03:17,120
‫alle Fehler, die

60
00:03:17,120 --> 00:03:20,300
‫wir mit dieser Klasse erstellen, alle Betriebsfehler sein.

61
00:03:20,300 --> 00:03:22,070
‫Fehler, die wir vorhersagen

62
00:03:22,070 --> 00:03:24,130
‫können, werden also irgendwann in der

63
00:03:24,130 --> 00:03:26,010
‫Zukunft auftreten, wie zum Beispiel ein

64
00:03:26,010 --> 00:03:29,560
‫Benutzer, der eine Tour ohne die erforderlichen Felder erstellt, oder?

65
00:03:29,560 --> 00:03:32,380
‫Das ist also ein Betriebsfehler, okay, und

66
00:03:32,380 --> 00:03:34,660
‫von nun an werden wir

67
00:03:34,660 --> 00:03:37,125
‫hier immer diese AppError-Klasse verwenden, die

68
00:03:37,125 --> 00:03:39,070
‫wir gerade erstellen,

69
00:03:39,070 --> 00:03:42,230
‫um alle Fehler in unserer Anwendung zu erstellen.

70
00:03:42,230 --> 00:03:44,730
‫Diese Fehler werden also Betriebsfehler sein, und was

71
00:03:44,730 --> 00:03:46,250
‫ich jetzt tun werde,

72
00:03:46,250 --> 00:03:49,663
‫ist tatsächlich auch eine . ist hier Betriebseigentum.

73
00:03:50,980 --> 00:03:53,133
‫Also das. betriebsbereit ist, und

74
00:03:56,100 --> 00:03:57,380
‫setzen Sie es auf true.

75
00:03:57,380 --> 00:03:59,240
‫Bei allen unseren Fehlern wird

76
00:03:59,240 --> 00:04:01,680
‫diese Eigenschaft auf "true" gesetzt, und

77
00:04:01,680 --> 00:04:03,420
‫ich tue dies,

78
00:04:03,420 --> 00:04:05,890
‫damit wir später auf diese Eigenschaft testen

79
00:04:05,890 --> 00:04:07,910
‫und nur Fehlermeldungen für diese

80
00:04:07,910 --> 00:04:10,360
‫Betriebsfehler, die wir mit dieser Klasse erstellt

81
00:04:10,360 --> 00:04:12,510
‫haben, an den Client zurücksenden können.

82
00:04:12,510 --> 00:04:14,550
‫Und das ist nützlich, weil

83
00:04:14,550 --> 00:04:17,210
‫einige andere verrückte unerwartete Fehler in unserer

84
00:04:17,210 --> 00:04:19,964
‫Anwendung auftreten können, zum Beispiel ein Programmierfehler oder

85
00:04:19,964 --> 00:04:22,360
‫ein Fehler in einem der Pakete, die

86
00:04:22,360 --> 00:04:24,550
‫wir in unserer App benötigen, und

87
00:04:24,550 --> 00:04:26,100
‫diese Fehler werden

88
00:04:26,100 --> 00:04:29,610
‫dann natürlich nicht diese haben. ist Betriebseigenschaft auf

89
00:04:29,610 --> 00:04:31,610
‫ihnen, in Ordnung, und es mag

90
00:04:31,610 --> 00:04:33,370
‫an dieser Stelle etwas verwirrend

91
00:04:33,370 --> 00:04:35,220
‫klingen, aber keine Sorge, es

92
00:04:35,220 --> 00:04:37,040
‫wird sehr viel Sinn machen,

93
00:04:37,040 --> 00:04:39,860
‫wenn wir dann den gerade erwähnten Teil implementieren.

94
00:04:39,860 --> 00:04:43,740
‫Also, testen dafür. ist hier Betriebseigentum.

95
00:04:43,740 --> 00:04:46,190
‫In Ordnung, und jetzt ist nur

96
00:04:46,190 --> 00:04:50,270
‫noch ein letzter Schritt, dass wir tatsächlich auch den Stack-Trace erfassen müssen.

97
00:04:50,270 --> 00:04:53,090
‫Was meine ich nun mit Stacktrace?

98
00:04:53,090 --> 00:04:55,430
‫Lassen Sie mich Ihnen das also

99
00:04:55,430 --> 00:04:58,380
‫zeigen, also zeigen Sie, was Stacktrace ist, und ich

100
00:04:58,380 --> 00:05:01,093
‫werde es hier in der Konsole protokollieren.

101
00:05:02,180 --> 00:05:05,053
‫Konsole. Protokoll und Fehler. stackTrace,

102
00:05:06,390 --> 00:05:10,350
‫also bekommt jeder einzelne Fehler diesen Stack-Trace, und

103
00:05:10,350 --> 00:05:13,370
‫eigentlich ist es nur ein Stack, okay.

104
00:05:13,370 --> 00:05:15,820
‫Also irr. stack wird uns im

105
00:05:15,820 --> 00:05:17,743
‫Grunde zeigen, wo der Fehler aufgetreten ist.

106
00:05:19,320 --> 00:05:20,743
‫Lassen Sie mich das

107
00:05:22,450 --> 00:05:24,303
‫jetzt hier ausführen, und schauen wir uns

108
00:05:26,420 --> 00:05:28,000
‫das an, und so sehen

109
00:05:28,000 --> 00:05:31,290
‫wir hier den Fehler und dann auch, wo er passiert ist, okay?

110
00:05:31,290 --> 00:05:33,040
‫Also, in diesem Fall hier

111
00:05:33,040 --> 00:05:36,390
‫natürlich App hinzufügen. js in Zeile 32.

112
00:05:36,390 --> 00:05:38,810
‫Also gleich hier.

113
00:05:38,810 --> 00:05:40,470
‫Also, dort haben wir

114
00:05:40,470 --> 00:05:42,200
‫diesen Fehler erzeugt, und so

115
00:05:42,200 --> 00:05:44,972
‫ist er jetzt in unserem Stack-Trace, und er

116
00:05:44,972 --> 00:05:49,972
‫zeigt uns auch den gesamten Call-Stack hier, der letztendlich in diesem Fehler entstanden ist, okay?

117
00:05:50,400 --> 00:05:52,440
‫Wir wollen das

118
00:05:52,440 --> 00:05:56,500
‫also irgendwie beibehalten und gleichzeitig diese Methode oder

119
00:05:56,500 --> 00:06:00,390
‫diese Klasse nicht zu dieser Stack-Spur hinzufügen, okay?

120
00:06:00,390 --> 00:06:02,350
‫Und das klingt wieder etwas verwirrend,

121
00:06:02,350 --> 00:06:03,980
‫ich weiß, aber in diesem

122
00:06:03,980 --> 00:06:06,359
‫Fall ist es nicht wirklich wichtig, es

123
00:06:06,359 --> 00:06:09,100
‫zählt nur, dass wir hier einfach diese Codezeile einfügen,

124
00:06:09,100 --> 00:06:11,873
‫die Error ist. capturestackTrace, also genau

125
00:06:13,670 --> 00:06:16,160
‫das, was Sie hier bekommen,

126
00:06:16,160 --> 00:06:19,490
‫und zuerst müssen wir das aktuelle Objekt

127
00:06:19,490 --> 00:06:23,530
‫angeben, und dann die AppError-Klasse selbst, die dies sein

128
00:06:23,530 --> 00:06:26,113
‫wird. Konstrukteur.

129
00:06:28,340 --> 00:06:31,220
‫Okay, wenn also ein neues Objekt erstellt

130
00:06:31,220 --> 00:06:34,361
‫und eine Konstruktorfunktion aufgerufen wird, wird dieser

131
00:06:34,361 --> 00:06:36,388
‫Funktionsaufruf nicht im Stack-Trace

132
00:06:36,388 --> 00:06:38,863
‫erscheinen und ihn nicht verschmutzen.

133
00:06:40,240 --> 00:06:41,073
‫In

134
00:06:42,250 --> 00:06:44,920
‫Ordnung, also legen wir es hier

135
00:06:44,920 --> 00:06:48,280
‫ab, und ja, das ist also unsere AppError-Klasse, und

136
00:06:48,280 --> 00:06:51,363
‫wir exportieren es jetzt tatsächlich von hier aus.

137
00:06:52,450 --> 00:06:56,443
‫Also Modul. exports ist natürlich der AppError.

138
00:06:57,340 --> 00:07:00,367
‫Großartig, nur eine Frage, die Sie möglicherweise haben, ist: "Warum habe

139
00:07:00,367 --> 00:07:04,720
‫ich das nicht eingestellt. Nachricht gleich Nachricht? ' Nun,

140
00:07:04,720 --> 00:07:07,600
‫das liegt nur daran, dass ich hier die

141
00:07:07,600 --> 00:07:10,253
‫Elternklasse aufgerufen habe, richtig, und die Elternklasse

142
00:07:10,253 --> 00:07:13,380
‫ist ein Fehler, und was immer wir ihr

143
00:07:13,380 --> 00:07:15,350
‫übergeben, wird die Nachrichteneigenschaft sein.

144
00:07:15,350 --> 00:07:16,860
‫Also genau wie ich dir schon sagte.

145
00:07:16,860 --> 00:07:20,880
‫Im Grunde haben wir hier durch diesen Elternaufruf die

146
00:07:20,880 --> 00:07:22,890
‫Message-Eigenschaft bereits auf unsere

147
00:07:22,890 --> 00:07:24,463
‫eingehende Nachricht gesetzt.

148
00:07:25,970 --> 00:07:28,500
‫In Ordnung, speichern Sie es und jetzt können wir es schließen,

149
00:07:28,500 --> 00:07:29,653
‫wir brauchen es nicht

150
00:07:30,770 --> 00:07:32,933
‫mehr und hier werden wir es einfach hier importieren.

151
00:07:34,621 --> 00:07:35,871
‫Const AppError,

152
00:07:38,980 --> 00:07:39,883
‫require,

153
00:07:41,560 --> 00:07:43,600
‫und dann ist

154
00:07:43,600 --> 00:07:48,320
‫es in utils, also Utilities, und appError, okay, und

155
00:07:48,320 --> 00:07:51,423
‫jetzt können wir es tatsächlich verwenden.

156
00:07:53,280 --> 00:07:55,070
‫Kommentieren Sie dieses Codestück aus und

157
00:07:55,070 --> 00:07:57,420
‫löschen Sie tatsächlich dasjenige, das wir zuvor

158
00:07:58,860 --> 00:08:00,210
‫hatten, und das

159
00:08:00,210 --> 00:08:02,650
‫wird jetzt den Fehler hier im nächsten erzeugen.

160
00:08:02,650 --> 00:08:04,433
‫Also, neuer AppError und dann

161
00:08:06,600 --> 00:08:07,783
‫die Nachricht, die

162
00:08:09,430 --> 00:08:10,793
‫diese ist, und

163
00:08:12,910 --> 00:08:14,023
‫der Statuscode.

164
00:08:15,620 --> 00:08:18,410
‫Richtig, und der Fehler, denk daran,

165
00:08:18,410 --> 00:08:22,480
‫wird dann automatisch herausgefunden, und also lass uns das

166
00:08:22,480 --> 00:08:23,723
‫alles löschen,

167
00:08:25,320 --> 00:08:29,630
‫hier speichern und noch einmal diese falsche Route testen, und

168
00:08:29,630 --> 00:08:32,940
‫tatsächlich erhalten wir immer noch den gleichen

169
00:08:32,940 --> 00:08:37,530
‫Fehler und wir erhalten auch immer noch genau den gleichen Stack-Trace.

170
00:08:37,530 --> 00:08:40,280
‫Okay, und schließlich möchte ich

171
00:08:40,280 --> 00:08:43,550
‫diese Middleware auch hierher exportieren, okay?

172
00:08:43,550 --> 00:08:45,260
‫Im Grunde also dieser Handler, weil

173
00:08:45,260 --> 00:08:47,150
‫wir im Rest des Abschnitts ein

174
00:08:47,150 --> 00:08:48,760
‫paar verschiedene Funktionen für den

175
00:08:48,760 --> 00:08:51,700
‫Umgang mit verschiedenen Arten von Fehlern erstellen werden, und deshalb

176
00:08:51,700 --> 00:08:53,280
‫möchte ich, dass sich

177
00:08:53,280 --> 00:08:55,912
‫alle diese Funktionen in derselben Datei befinden, in Ordnung?

178
00:08:55,912 --> 00:08:58,920
‫Und wir können sagen, dass alle diese

179
00:08:58,920 --> 00:09:02,310
‫Funktionen, die ich gerade erwähnt habe, Handler sind,

180
00:09:02,310 --> 00:09:05,320
‫okay, und daher Handler, wir nennen sie

181
00:09:05,320 --> 00:09:08,240
‫im Kontext der MVC-Architektur auch Controller, und

182
00:09:08,240 --> 00:09:10,130
‫lassen Sie uns

183
00:09:10,130 --> 00:09:13,253
‫nun tatsächlich eine Fehler-Controller-Datei in unserem Controller-Ordner erstellen.

184
00:09:14,190 --> 00:09:18,280
‫Okay, und das mag seltsam klingen oder aussehen, weil wir eigentlich keine

185
00:09:18,280 --> 00:09:21,330
‫Fehlerquelle haben, okay, und daher werden mir wahrscheinlich einige

186
00:09:22,200 --> 00:09:24,940
‫Leute nicht zustimmen, dass dies der richtige Ort

187
00:09:24,940 --> 00:09:26,923
‫ist, aber ich persönlich mache

188
00:09:28,540 --> 00:09:31,100
‫es gerne so, weil bei Am Ende

189
00:09:31,100 --> 00:09:32,520
‫des Tages, diese

190
00:09:32,520 --> 00:09:34,910
‫Funktionen sind sozusagen wirklich zur Kontrolle

191
00:09:34,910 --> 00:09:37,370
‫unserer Fehler, in Ordnung, und so macht

192
00:09:37,370 --> 00:09:39,570
‫es zumindest für mich Sinn, diese

193
00:09:39,570 --> 00:09:43,140
‫Funktion hier einfach als Fehler-Controller zu bezeichnen, und hier wollte ich

194
00:09:43,140 --> 00:09:46,500
‫diese Middleware-Funktion einfügen , aber ich glaube, ich habe es

195
00:09:46,500 --> 00:09:49,173
‫nicht kopiert, also machen wir das noch einmal.

196
00:09:51,010 --> 00:09:53,540
‫Alles klar, und eigentlich werde ich dieses hier

197
00:09:53,540 --> 00:09:56,240
‫als Modul exportieren. exports, da

198
00:09:56,240 --> 00:09:57,676
‫die anderen Handle-Funktionen, die

199
00:09:57,676 --> 00:09:59,606
‫wir später erstellen werden, ich

200
00:09:59,606 --> 00:10:02,440
‫sie von hier aus nicht exportieren werde.

201
00:10:02,440 --> 00:10:05,453
‫Sie sind also einfach nur Helfer.

202
00:10:06,320 --> 00:10:11,320
‫Also Modul. exports entspricht dieser Funktion, okay?

203
00:10:12,210 --> 00:10:15,420
‫Lassen Sie uns diese Konsole tatsächlich loswerden. loggen Sie sich

204
00:10:15,420 --> 00:10:18,510
‫hier ein, speichern Sie es und jetzt zurück

205
00:10:18,510 --> 00:10:21,080
‫in unsere App müssen wir natürlich

206
00:10:21,080 --> 00:10:23,040
‫jetzt diese Middleware-Funktion hier anschließen.

207
00:10:23,040 --> 00:10:25,660
‫Also, lass es uns wieder importieren

208
00:10:26,700 --> 00:10:28,710
‫und ich kann es

209
00:10:28,710 --> 00:10:29,760
‫nennen,

210
00:10:30,802 --> 00:10:32,635
‫wie ich will, und

211
00:10:34,679 --> 00:10:36,853
‫so nenne es globalErrorHandler mit

212
00:10:38,650 --> 00:10:39,840
‫einem großen H,

213
00:10:42,300 --> 00:10:45,033
‫und ich werde Controller und errorController benötigen.

214
00:10:49,700 --> 00:10:52,660
‫Setzen Sie es hierher zurück, und jetzt für den

215
00:10:52,660 --> 00:10:54,343
‫letzten Test nach dieser Umgestaltung.

216
00:10:55,810 --> 00:10:58,970
‫Mal sehen, und tatsächlich

217
00:10:58,970 --> 00:11:03,040
‫funktioniert noch einmal alles gut, okay?

218
00:11:03,040 --> 00:11:06,490
‫Also perfekt, das war das Ziel für dieses Video,

219
00:11:06,490 --> 00:11:07,690
‫bis zum nächsten.

