﻿1
00:00:01,100 --> 00:00:02,750
‫Professor: Neste vídeo, vamos

2
00:00:02,750 --> 00:00:05,470
‫agora criar uma classe de erro melhor e mais

3
00:00:05,470 --> 00:00:07,373
‫útil, e também fazer algumas refatorações.

4
00:00:09,210 --> 00:00:11,870
‫E começando com essa classe de erro,

5
00:00:11,870 --> 00:00:15,053
‫vamos criar um novo arquivo em nossa pasta Utilities.

6
00:00:15,950 --> 00:00:18,990
‫Então, novo arquivo, e vou chamá-lo

7
00:00:20,980 --> 00:00:25,820
‫de AppError porque esse será o nome da classe, certo?

8
00:00:25,820 --> 00:00:30,820
‫Então, classifique AppError, e realmente queremos que todos os nossos

9
00:00:30,867 --> 00:00:34,780
‫objetos AppError sejam herdados do erro embutido

10
00:00:34,780 --> 00:00:39,260
‫e, portanto, vamos estender a classe de erro embutido.

11
00:00:39,260 --> 00:00:43,720
‫Então, usamos extends Error, ok?

12
00:00:43,720 --> 00:00:46,870
‫Então, nós fizemos isso antes em algum

13
00:00:46,870 --> 00:00:50,950
‫lugar neste curso, e novamente são apenas aulas ES6, certo?

14
00:00:50,950 --> 00:00:52,920
‫Nesse caso, herança de

15
00:00:52,920 --> 00:00:56,790
‫classe, onde uma classe herda da outra, certo?

16
00:00:56,790 --> 00:00:59,300
‫Então, como sempre, nosso construtor, e

17
00:00:59,300 --> 00:01:01,800
‫o que vamos passar para

18
00:01:01,800 --> 00:01:04,490
‫um novo objeto criado a partir da

19
00:01:04,490 --> 00:01:08,660
‫classe AppError, será a mensagem e o statusCode, então apenas

20
00:01:08,660 --> 00:01:09,853
‫esses dois.

21
00:01:11,330 --> 00:01:15,130
‫Ok, então, lembre-se de que o método construtor é

22
00:01:15,130 --> 00:01:19,210
‫chamado cada vez que criamos um novo objeto desta classe.

23
00:01:19,210 --> 00:01:22,116
‫Agora, como de costume, quando estendemos

24
00:01:22,116 --> 00:01:25,760
‫uma classe pai, chamamos super para chamar o construtor

25
00:01:25,760 --> 00:01:28,203
‫pai, certo, e fazemos isso

26
00:01:30,100 --> 00:01:33,580
‫com mensagem porque a mensagem é na verdade

27
00:01:33,580 --> 00:01:37,160
‫o único parâmetro que o erro embutido aceita.

28
00:01:37,160 --> 00:01:40,990
‫Ok, então isso é basicamente você está chamando

29
00:01:40,990 --> 00:01:44,305
‫o erro, certo, e então aqui

30
00:01:44,305 --> 00:01:46,160
‫está o material

31
00:01:48,300 --> 00:01:53,030
‫usual, definimos statusCode para statusCode, tudo bem, e agora

32
00:01:53,030 --> 00:01:56,463
‫também queremos definir o próprio status.

33
00:01:58,200 --> 00:02:01,670
‫Portanto, lembre-se que o status pode ser falha ou erro,

34
00:02:01,670 --> 00:02:03,920
‫e poderíamos passar isso para o objeto,

35
00:02:03,920 --> 00:02:05,700
‫mas também não é

36
00:02:05,700 --> 00:02:08,530
‫realmente necessário, porque o status depende do statusCode.

37
00:02:08,530 --> 00:02:10,880
‫Então, quando o statusCode for 400,

38
00:02:10,880 --> 00:02:12,630
‫o status será

39
00:02:12,630 --> 00:02:16,230
‫falha, e se for 500, será um erro, certo,

40
00:02:16,230 --> 00:02:18,336
‫e isso simplesmente testa se

41
00:02:18,336 --> 00:02:20,420
‫o statusCode começa com quatro.

42
00:02:20,420 --> 00:02:23,800
‫Então, em JavaScript, há um método startsWith que podemos chamar em

43
00:02:23,800 --> 00:02:25,540
‫strings, e então eu

44
00:02:25,540 --> 00:02:28,100
‫acho que é a maneira mais fácil de

45
00:02:28,100 --> 00:02:31,363
‫fazer este teste, e isso basicamente converte o statusCode em uma

46
00:02:32,780 --> 00:02:35,610
‫string, e para isso estou simplesmente usando um string

47
00:02:35,610 --> 00:02:38,030
‫de template com o código lá, então isso,

48
00:02:38,030 --> 00:02:40,380
‫ou na verdade, podemos apenas usar statusCode.

49
00:02:41,781 --> 00:02:42,614
‫Então, statusCode

50
00:02:47,001 --> 00:02:48,750
‫e, em seguida, startsWith, aqui

51
00:02:48,750 --> 00:02:51,120
‫também precisamos de uma string e, se statusCode

52
00:02:51,120 --> 00:02:54,330
‫como uma string começar com quatro, bem, teremos uma falha.

53
00:02:54,330 --> 00:02:58,360
‫E então aqui, vamos usar o ternário,

54
00:02:58,360 --> 00:03:02,120
‫ok, então é falha quando começa

55
00:03:02,120 --> 00:03:06,890
‫com quatro e, do contrário, é um erro, ok?

56
00:03:06,890 --> 00:03:09,550
‫Então, muito simples, e isso já nos

57
00:03:09,550 --> 00:03:13,250
‫poupa de ter que passar manualmente em falha ou erro.

58
00:03:13,250 --> 00:03:15,240
‫Tudo bem, agora a seguir,

59
00:03:15,240 --> 00:03:17,120
‫todos os erros que

60
00:03:17,120 --> 00:03:20,300
‫criarmos usando essa classe serão todos erros operacionais.

61
00:03:20,300 --> 00:03:22,070
‫Então, erros que podemos

62
00:03:22,070 --> 00:03:24,130
‫prever vão acontecer em algum momento

63
00:03:24,130 --> 00:03:26,010
‫no futuro, como por exemplo

64
00:03:26,010 --> 00:03:29,560
‫um usuário criando um tour sem os campos obrigatórios, certo?

65
00:03:29,560 --> 00:03:32,380
‫Então isso é um erro operacional, ok,

66
00:03:32,380 --> 00:03:34,660
‫e novamente, de agora em diante,

67
00:03:34,660 --> 00:03:37,125
‫sempre usaremos essa classe AppError aqui

68
00:03:37,125 --> 00:03:39,070
‫que estamos criando agora

69
00:03:39,070 --> 00:03:42,230
‫para criar todos os erros em nosso aplicativo.

70
00:03:42,230 --> 00:03:44,730
‫E esses erros serão erros operacionais, então

71
00:03:44,730 --> 00:03:46,250
‫o que vou fazer

72
00:03:46,250 --> 00:03:49,663
‫agora é criar também um. é propriedade operacional aqui.

73
00:03:50,980 --> 00:03:53,133
‫Então, é isso. está operacional

74
00:03:56,100 --> 00:03:57,380
‫e defina-o como verdadeiro.

75
00:03:57,380 --> 00:03:59,240
‫Portanto, todos os nossos erros

76
00:03:59,240 --> 00:04:01,680
‫farão com que essa propriedade seja definida

77
00:04:01,680 --> 00:04:03,420
‫como true, e estou

78
00:04:03,420 --> 00:04:05,890
‫fazendo isso para que mais tarde possamos testar

79
00:04:05,890 --> 00:04:07,910
‫essa propriedade e apenas enviar mensagens

80
00:04:07,910 --> 00:04:10,360
‫de erro de volta ao cliente para esses

81
00:04:10,360 --> 00:04:12,510
‫erros operacionais que criamos usando essa classe.

82
00:04:12,510 --> 00:04:14,550
‫E isso é útil porque

83
00:04:14,550 --> 00:04:17,210
‫alguns outros erros malucos inesperados que podem acontecer

84
00:04:17,210 --> 00:04:19,964
‫em nosso aplicativo, por exemplo, um erro de

85
00:04:19,964 --> 00:04:22,360
‫programação ou algum bug em um dos

86
00:04:22,360 --> 00:04:24,550
‫pacotes que exigimos em nosso aplicativo,

87
00:04:24,550 --> 00:04:26,100
‫e esses erros,

88
00:04:26,100 --> 00:04:29,610
‫então, obviamente não terão isso. é uma propriedade

89
00:04:29,610 --> 00:04:31,610
‫operacional neles, certo, e pode

90
00:04:31,610 --> 00:04:33,370
‫parecer um pouco confuso

91
00:04:33,370 --> 00:04:35,220
‫neste ponto, mas não se

92
00:04:35,220 --> 00:04:37,040
‫preocupe, fará muito sentido quando

93
00:04:37,040 --> 00:04:39,860
‫implementarmos aquela parte que acabei de mencionar.

94
00:04:39,860 --> 00:04:43,740
‫Então, testando isso. é propriedade operacional aqui.

95
00:04:43,740 --> 00:04:46,190
‫Tudo bem, e agora apenas uma

96
00:04:46,190 --> 00:04:50,270
‫última etapa é que também precisamos capturar o rastreamento de pilha.

97
00:04:50,270 --> 00:04:53,090
‫Agora, o que quero dizer com rastreamento de pilha?

98
00:04:53,090 --> 00:04:55,430
‫E então, deixe-me mostrar isso para

99
00:04:55,430 --> 00:04:58,380
‫você, então, mostrar o que é rastreamento de pilha,

100
00:04:58,380 --> 00:05:01,093
‫e então eu irei registrá-lo aqui no console.

101
00:05:02,180 --> 00:05:05,053
‫Console. log e erro. stackTrace,

102
00:05:06,390 --> 00:05:10,350
‫então cada erro obtém esse rastreamento de pilha e,

103
00:05:10,350 --> 00:05:13,370
‫na verdade, é apenas uma pilha, certo.

104
00:05:13,370 --> 00:05:15,820
‫Então erre. pilha irá basicamente

105
00:05:15,820 --> 00:05:17,743
‫nos mostrar onde o erro aconteceu.

106
00:05:19,320 --> 00:05:20,743
‫Deixe-me executar isso

107
00:05:22,450 --> 00:05:24,303
‫aqui agora, vamos dar uma

108
00:05:26,420 --> 00:05:28,000
‫olhada nisso, e isso nos

109
00:05:28,000 --> 00:05:31,290
‫dá aqui o erro e também onde aconteceu, ok?

110
00:05:31,290 --> 00:05:33,040
‫Portanto, neste caso aqui, é

111
00:05:33,040 --> 00:05:36,390
‫claro, adicione o aplicativo. js na linha 32.

112
00:05:36,390 --> 00:05:38,810
‫Então, bem aqui.

113
00:05:38,810 --> 00:05:40,470
‫Então, foi aí que

114
00:05:40,470 --> 00:05:42,200
‫criamos esse erro, e agora

115
00:05:42,200 --> 00:05:44,972
‫está em nosso rastreamento de pilha, e também nos

116
00:05:44,972 --> 00:05:49,972
‫mostra toda a pilha de chamadas aqui, que no final se originou neste erro, ok?

117
00:05:50,400 --> 00:05:52,440
‫Então, queremos preservar isso

118
00:05:52,440 --> 00:05:56,500
‫e também, ao mesmo tempo, não adicionar esse método

119
00:05:56,500 --> 00:06:00,390
‫aqui, ou essa classe, à trilha de pilha, certo?

120
00:06:00,390 --> 00:06:02,350
‫E, novamente, isso parece um pouco

121
00:06:02,350 --> 00:06:03,980
‫confuso, eu sei, mas neste

122
00:06:03,980 --> 00:06:06,359
‫caso não é muito importante, tudo o que

123
00:06:06,359 --> 00:06:09,100
‫importa é que apenas adicionamos esta linha de código

124
00:06:09,100 --> 00:06:11,873
‫aqui, que é Error. capturestackTrace, então exatamente

125
00:06:13,670 --> 00:06:16,160
‫o que você obtém aqui,

126
00:06:16,160 --> 00:06:19,490
‫e primeiro precisamos especificar o objeto atual, que

127
00:06:19,490 --> 00:06:23,530
‫é este, e então a própria classe AppError, que

128
00:06:23,530 --> 00:06:26,113
‫será isso. construtor.

129
00:06:28,340 --> 00:06:31,220
‫Ok, e desta forma, quando um novo objeto é

130
00:06:31,220 --> 00:06:34,361
‫criado e uma função construtora é chamada, essa chamada

131
00:06:34,361 --> 00:06:36,388
‫de função não aparecerá no

132
00:06:36,388 --> 00:06:38,863
‫rastreamento de pilha e não o poluirá.

133
00:06:40,240 --> 00:06:41,073
‫Tudo

134
00:06:42,250 --> 00:06:44,920
‫bem, vamos colocá-lo aqui,

135
00:06:44,920 --> 00:06:48,280
‫e sim, essa é nossa classe AppError,

136
00:06:48,280 --> 00:06:51,363
‫e agora vamos realmente exportá-lo daqui.

137
00:06:52,450 --> 00:06:56,443
‫Então, módulo. as exportações são, obviamente, o AppError.

138
00:06:57,340 --> 00:07:00,367
‫Ótimo, apenas uma pergunta que você pode ter é 'Por

139
00:07:00,367 --> 00:07:04,720
‫que não fiz isso. mensagem igual a mensagem? 'Bem, isso

140
00:07:04,720 --> 00:07:07,600
‫é apenas porque aqui eu chamei a classe

141
00:07:07,600 --> 00:07:10,253
‫pai, certo, e a classe pai é

142
00:07:10,253 --> 00:07:13,380
‫o erro, e tudo o que passarmos para ela

143
00:07:13,380 --> 00:07:15,350
‫será a propriedade da mensagem.

144
00:07:15,350 --> 00:07:16,860
‫Assim como eu disse antes.

145
00:07:16,860 --> 00:07:20,880
‫E então, basicamente, aqui, ao fazer esta chamada pai, já definimos a

146
00:07:20,880 --> 00:07:22,890
‫propriedade da mensagem para a nossa

147
00:07:22,890 --> 00:07:24,463
‫mensagem de entrada.

148
00:07:25,970 --> 00:07:28,500
‫Tudo bem, salve-o e agora podemos fechá-lo, não

149
00:07:28,500 --> 00:07:29,653
‫precisamos mais dele,

150
00:07:30,770 --> 00:07:32,933
‫e aqui vamos apenas importá-lo aqui.

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
‫e, em seguida,

154
00:07:43,600 --> 00:07:48,320
‫está em utils, então Utilities e appError, ok, e

155
00:07:48,320 --> 00:07:51,423
‫agora vamos realmente prosseguir e usá-lo.

156
00:07:53,280 --> 00:07:55,070
‫Comente este trecho de código

157
00:07:55,070 --> 00:07:57,420
‫e exclua o que tínhamos antes,

158
00:07:58,860 --> 00:08:00,210
‫e isso criará

159
00:08:00,210 --> 00:08:02,650
‫o erro bem aqui dentro do próximo.

160
00:08:02,650 --> 00:08:04,433
‫Então, new AppError, e então

161
00:08:06,600 --> 00:08:07,783
‫a mensagem, que é

162
00:08:09,430 --> 00:08:10,793
‫esta, e o código

163
00:08:12,910 --> 00:08:14,023
‫de status.

164
00:08:15,620 --> 00:08:18,410
‫Certo, e a falha, lembre-se,

165
00:08:18,410 --> 00:08:22,480
‫será então automaticamente descoberta, então vamos excluir tudo

166
00:08:22,480 --> 00:08:23,723
‫isso, salvá-lo

167
00:08:25,320 --> 00:08:29,630
‫aqui e mais uma vez, testar esta rota errada

168
00:08:29,630 --> 00:08:32,940
‫e, de fato, ainda obteremos o mesmo

169
00:08:32,940 --> 00:08:37,530
‫erro, e ainda obtemos exatamente o mesmo rastreamento de pilha.

170
00:08:37,530 --> 00:08:40,280
‫Ok, e finalmente eu também

171
00:08:40,280 --> 00:08:43,550
‫quero exportar este middleware aqui, ok?

172
00:08:43,550 --> 00:08:45,260
‫Então, basicamente, esse manipulador, porque

173
00:08:45,260 --> 00:08:47,150
‫no restante da seção, vamos construir

174
00:08:47,150 --> 00:08:48,760
‫algumas funções diferentes para

175
00:08:48,760 --> 00:08:51,700
‫lidar com diferentes tipos de erros e, portanto, quero

176
00:08:51,700 --> 00:08:53,280
‫que todas essas

177
00:08:53,280 --> 00:08:55,912
‫funções estejam todas no mesmo arquivo, certo?

178
00:08:55,912 --> 00:08:58,920
‫E podemos dizer que todas essas funções

179
00:08:58,920 --> 00:09:02,310
‫que acabei de mencionar são manipuladores, ok, e manipuladores,

180
00:09:02,310 --> 00:09:05,320
‫também os chamamos de controladores no contexto

181
00:09:05,320 --> 00:09:08,240
‫da arquitetura MVC e, portanto, agora vamos

182
00:09:08,240 --> 00:09:10,130
‫criar um arquivo de

183
00:09:10,130 --> 00:09:13,253
‫controlador de erro em nossa pasta de controladores.

184
00:09:14,190 --> 00:09:18,280
‫Ok, e isso pode soar ou parecer um pouco estranho, porque na verdade

185
00:09:18,280 --> 00:09:21,330
‫não temos um recurso de erro ok, então provavelmente

186
00:09:22,200 --> 00:09:24,940
‫algumas pessoas vão discordar de mim que este é

187
00:09:24,940 --> 00:09:26,923
‫o lugar correto, mas eu pessoalmente

188
00:09:28,540 --> 00:09:31,100
‫gosto de fazer assim porque em no final

189
00:09:31,100 --> 00:09:32,520
‫das contas, essas

190
00:09:32,520 --> 00:09:34,910
‫funções, elas meio que servem mesmo para

191
00:09:34,910 --> 00:09:37,370
‫controlar nossos erros, tudo bem, e então

192
00:09:37,370 --> 00:09:39,570
‫para mim pelo menos faz sentido

193
00:09:39,570 --> 00:09:43,140
‫simplesmente chamar essa função aqui de controlador de erro, e aqui

194
00:09:43,140 --> 00:09:46,500
‫eu queria colar aquela função de middleware , mas acho que

195
00:09:46,500 --> 00:09:49,173
‫não copiei, então vamos fazer isso de novo.

196
00:09:51,010 --> 00:09:53,540
‫Tudo bem, então, na verdade, irei exportar este

197
00:09:53,540 --> 00:09:56,240
‫aqui como o módulo. exporta porque

198
00:09:56,240 --> 00:09:57,676
‫as outras funções

199
00:09:57,676 --> 00:09:59,606
‫de manipulação que iremos

200
00:09:59,606 --> 00:10:02,440
‫criar mais tarde, não as exportarei daqui.

201
00:10:02,440 --> 00:10:05,453
‫Então, eles vão ser apenas ajudantes.

202
00:10:06,320 --> 00:10:11,320
‫Então, módulo. exportações são iguais a esta função, ok?

203
00:10:12,210 --> 00:10:15,420
‫Vamos nos livrar deste console. log aqui, salve-o

204
00:10:15,420 --> 00:10:18,510
‫e agora de volta ao nosso aplicativo, é

205
00:10:18,510 --> 00:10:21,080
‫claro que agora precisamos conectar essa

206
00:10:21,080 --> 00:10:23,040
‫função de middleware aqui.

207
00:10:23,040 --> 00:10:25,660
‫Então, vamos novamente prosseguir e importá-lo

208
00:10:26,700 --> 00:10:28,710
‫e eu posso chamá-lo

209
00:10:28,710 --> 00:10:29,760
‫do

210
00:10:30,802 --> 00:10:32,635
‫que eu quiser, então

211
00:10:34,679 --> 00:10:36,853
‫deixe-me chamá-lo de globalErrorHandler com

212
00:10:38,650 --> 00:10:39,840
‫H maiúsculo,

213
00:10:42,300 --> 00:10:45,033
‫e irei requerer controladores e errorController.

214
00:10:49,700 --> 00:10:52,660
‫Coloque-o de volta aqui, e agora para o teste

215
00:10:52,660 --> 00:10:54,343
‫final após esta refatoração.

216
00:10:55,810 --> 00:10:58,970
‫Vamos ver, e de fato

217
00:10:58,970 --> 00:11:03,040
‫mais uma vez, tudo funciona bem, ok?

218
00:11:03,040 --> 00:11:06,490
‫Então, perfeito, esse era o objetivo desse vídeo, até

219
00:11:06,490 --> 00:11:07,690
‫o próximo.

