﻿1
00:00:01,050 --> 00:00:02,840
‫Instrutor: Agora vamos fazer

2
00:00:02,840 --> 00:00:04,780
‫mais uso de nosso negócio de

3
00:00:04,780 --> 00:00:07,400
‫classe AppError, adicionando alguns erros 404 e algumas

4
00:00:07,400 --> 00:00:09,493
‫de nossas funções de manipulador de tour.

5
00:00:10,446 --> 00:00:12,740
‫Agora, apenas uma coisa que

6
00:00:12,740 --> 00:00:16,030
‫eu queria dizer antes de realmente implementarmos esses

7
00:00:16,030 --> 00:00:19,640
‫erros 404 é que, claro, poderíamos ter usado a

8
00:00:19,640 --> 00:00:22,290
‫função catchAsync também em nosso roteador, certo?

9
00:00:22,290 --> 00:00:24,940
‫Então, deixe-me mostrar como isso funcionaria.

10
00:00:24,940 --> 00:00:27,090
‫Então, aqui em

11
00:00:27,090 --> 00:00:29,730
‫TourRoutes, eu poderia ter

12
00:00:30,750 --> 00:00:34,530
‫agrupado essa função aqui em catchAsync assim,

13
00:00:34,530 --> 00:00:38,480
‫em vez de fazer aqui no controlador.

14
00:00:38,480 --> 00:00:41,400
‫Então, aqui onde eu fiz de fato, certo?

15
00:00:41,400 --> 00:00:44,200
‫E isso teria exatamente o mesmo resultado,

16
00:00:44,200 --> 00:00:45,950
‫mas eu não

17
00:00:45,950 --> 00:00:48,190
‫fiz dessa maneira porque assim, tenho

18
00:00:48,190 --> 00:00:50,110
‫que lembrar qual desses métodos

19
00:00:50,110 --> 00:00:52,350
‫aqui é realmente um método

20
00:00:52,350 --> 00:00:54,800
‫de sincronização, ok, de modo que

21
00:00:54,800 --> 00:00:58,960
‫apenas nesses eu realmente adiciono a função catchAsync , direito?

22
00:00:58,960 --> 00:01:02,150
‫Agora, neste caso, na verdade, todos eles são funções

23
00:01:02,150 --> 00:01:05,700
‫assíncronas e, portanto, não é esse o problema aqui neste

24
00:01:05,700 --> 00:01:07,530
‫exemplo, mas haverá alguns exemplos

25
00:01:07,530 --> 00:01:11,150
‫mais tarde em que nem todos os manipuladores são funções

26
00:01:11,150 --> 00:01:12,170
‫assíncronas e,

27
00:01:12,170 --> 00:01:14,020
‫nesse caso, eu realmente teria

28
00:01:14,020 --> 00:01:17,100
‫para lembrar qual deles eu tenho que envolver

29
00:01:17,100 --> 00:01:18,600
‫em catchAsync e

30
00:01:18,600 --> 00:01:20,450
‫quais não e então, fazer

31
00:01:20,450 --> 00:01:23,930
‫isso no controlador é muito mais fácil porque simplesmente cada

32
00:01:23,930 --> 00:01:25,520
‫vez que estou escrevendo

33
00:01:25,520 --> 00:01:27,190
‫uma função assíncrona aqui,

34
00:01:27,190 --> 00:01:30,220
‫eles já sabem bem, preciso embrulhar em catchAsync.

35
00:01:30,220 --> 00:01:31,350
‫OK.

36
00:01:31,350 --> 00:01:32,880
‫Então, eu não estou

37
00:01:32,880 --> 00:01:36,400
‫fazendo isso aqui, eu apenas faço como mostrei no último vídeo.

38
00:01:36,400 --> 00:01:39,680
‫Ok, na verdade, uma vez encontrei um bug que

39
00:01:39,680 --> 00:01:41,330
‫era muito difícil

40
00:01:41,330 --> 00:01:43,160
‫de encontrar porque eu envolvi

41
00:01:43,160 --> 00:01:45,690
‫uma função que não era assíncrona em

42
00:01:45,690 --> 00:01:47,850
‫catchAsync e então não estávamos

43
00:01:47,850 --> 00:01:50,350
‫funcionando e não consegui descobrir onde estava

44
00:01:50,350 --> 00:01:52,830
‫o bug e desperdicei muito tempo naquele.

45
00:01:52,830 --> 00:01:56,820
‫E assim, desde então, não coloquei mais catchAsync aqui, mas

46
00:01:56,820 --> 00:01:59,610
‫muito perto de onde eu realmente

47
00:01:59,610 --> 00:02:02,860
‫preciso, tão perto do código que é realmente assíncrono.

48
00:02:02,860 --> 00:02:04,640
‫Ok, com isso

49
00:02:04,640 --> 00:02:07,820
‫dito, vamos implementar alguns erros 404 aqui.

50
00:02:07,820 --> 00:02:09,680
‫Tudo bem, então eu

51
00:02:09,680 --> 00:02:11,680
‫quero começar mostrando a vocês novamente

52
00:02:11,680 --> 00:02:13,830
‫o exemplo que fizemos no último vídeo.

53
00:02:13,830 --> 00:02:16,350
‫Ok, então tentamos fazer um tour

54
00:02:16,350 --> 00:02:19,780
‫por esse ID estranho que realmente não existe e

55
00:02:19,780 --> 00:02:20,989
‫o erro

56
00:02:20,989 --> 00:02:23,690
‫que obtivemos é que basicamente o

57
00:02:23,690 --> 00:02:26,410
‫Mongoose não conseguiu converter essa string

58
00:02:26,410 --> 00:02:29,630
‫aqui em um ID válido para o MongoDB.

59
00:02:29,630 --> 00:02:33,653
‫Mas o que acontece quando realmente usamos um ID válido do MongoDB?

60
00:02:34,750 --> 00:02:38,003
‫Então, por exemplo, vamos, sim, vamos copiar este

61
00:02:38,003 --> 00:02:39,173
‫aqui, ok,

62
00:02:41,660 --> 00:02:44,670
‫e este obviamente terá um resultado e

63
00:02:44,670 --> 00:02:47,770
‫então, vamos apenas alterá-lo ligeiramente, então por exemplo,

64
00:02:47,770 --> 00:02:50,060
‫alterar isso para zero aqui ainda

65
00:02:50,060 --> 00:02:52,340
‫será um ID válido , então

66
00:02:52,340 --> 00:02:53,900
‫fica assim e

67
00:02:53,900 --> 00:02:56,000
‫é exatamente o mesmo de

68
00:02:56,000 --> 00:02:57,440
‫antes, eu apenas

69
00:02:57,440 --> 00:03:00,830
‫alterei um número, mas esse ID provavelmente não existirá.

70
00:03:00,830 --> 00:03:03,470
‫E então, vamos ver o que temos então.

71
00:03:03,470 --> 00:03:06,810
‫E, de fato, agora nosso resultado aqui é nulo.

72
00:03:06,810 --> 00:03:10,340
‫Tudo bem, então, não é isso que queremos, é?

73
00:03:10,340 --> 00:03:14,550
‫O que queremos aqui é mostrar um código de status 404 aqui e

74
00:03:14,550 --> 00:03:17,310
‫dizer que este tour não foi encontrado.

75
00:03:17,310 --> 00:03:20,750
‫Ok e então, vamos agora usar a classe

76
00:03:20,750 --> 00:03:22,580
‫orAppError para implementar isso.

77
00:03:22,580 --> 00:03:24,040
‫Lembre-se de que o

78
00:03:24,040 --> 00:03:26,880
‫passeio que faremos de volta aqui é nulo, certo?

79
00:03:26,880 --> 00:03:29,453
‫Então, null que agora podemos testar.

80
00:03:30,920 --> 00:03:33,533
‫Então, se formos para o nosso manipulador

81
00:03:35,260 --> 00:03:40,260
‫getTour, vamos agora implementar se não houver tour e nesse caso iremos criar

82
00:03:41,030 --> 00:03:43,390
‫ou erro e isso aqui funciona

83
00:03:44,410 --> 00:03:45,243
‫porque

84
00:03:45,243 --> 00:03:46,650
‫se não houver

85
00:03:46,650 --> 00:03:47,710
‫tour, será nulo.

86
00:03:47,710 --> 00:03:51,610
‫Lembre-se de que, em JavaScript, nulo é um valor falácia, portanto,

87
00:03:51,610 --> 00:03:54,660
‫um valor que será convertido em falso aqui

88
00:03:54,660 --> 00:03:56,250
‫em uma instrução if.

89
00:03:56,250 --> 00:03:58,060
‫Ok, e então, se não houver

90
00:03:58,060 --> 00:03:59,450
‫um tour, então

91
00:03:59,450 --> 00:04:01,790
‫o tour é falso e não falso

92
00:04:01,790 --> 00:04:04,830
‫é claro, é assim que entramos neste bloco if.

93
00:04:04,830 --> 00:04:07,600
‫Então, o que queremos fazer se não houver turnê?

94
00:04:07,600 --> 00:04:11,530
‫Bem, queremos criar o próximo com um erro.

95
00:04:11,530 --> 00:04:14,861
‫Então, para pular direto para o erro e o

96
00:04:14,861 --> 00:04:15,990
‫middleware vinculado.

97
00:04:15,990 --> 00:04:18,870
‫Então, fazemos um novo AppError que ainda

98
00:04:20,610 --> 00:04:23,350
‫não está disponível, ainda temos

99
00:04:23,350 --> 00:04:26,120
‫que importá-lo, mas vamos usá-lo aqui imediatamente.

100
00:04:26,120 --> 00:04:27,950
‫Ok, digamos que

101
00:04:30,500 --> 00:04:34,673
‫nenhum tour foi encontrado com esse ID.

102
00:04:35,580 --> 00:04:37,070
‫E então um código

103
00:04:37,070 --> 00:04:40,940
‫de status, lembre-se de que o segundo argumento é 404, certo?

104
00:04:40,940 --> 00:04:43,460
‫Agora, uma última coisa que precisamos

105
00:04:43,460 --> 00:04:46,470
‫fazer aqui é dizer return, ok porque queremos

106
00:04:46,470 --> 00:04:49,410
‫retornar esta função imediatamente e não passar

107
00:04:49,410 --> 00:04:52,250
‫para a próxima linha que seria esta

108
00:04:52,250 --> 00:04:53,690
‫e que

109
00:04:53,690 --> 00:04:57,800
‫basicamente tentaria enviar duas respostas e nós já se deparou com

110
00:04:57,800 --> 00:05:00,210
‫esse erro antes, então espero que

111
00:05:00,210 --> 00:05:02,020
‫você se lembre disso

112
00:05:02,020 --> 00:05:05,580
‫e é por isso que sempre precisamos retornar aqui.

113
00:05:05,580 --> 00:05:09,610
‫Ok, vamos agora importar rapidamente o appError e isso é

114
00:05:10,870 --> 00:05:13,200
‫semelhante a este aqui, então

115
00:05:13,200 --> 00:05:14,823
‫vamos apenas duplicar.

116
00:05:17,990 --> 00:05:21,203
‫Ok, e aqui está na verdade com A maiúsculo.

117
00:05:22,170 --> 00:05:24,210
‫Tudo bem, salve e

118
00:05:24,210 --> 00:05:25,850
‫vamos tentar novamente

119
00:05:27,160 --> 00:05:31,450
‫e agora nenhum tour foi encontrado com esse ID 404.

120
00:05:31,450 --> 00:05:34,440
‫Perfeito, então exatamente o que queríamos.

121
00:05:34,440 --> 00:05:37,170
‫Ah, e você também viu que falhamos aqui.

122
00:05:37,170 --> 00:05:40,980
‫Ok e isso também vem de ou da classe.

123
00:05:40,980 --> 00:05:44,270
‫Ótimo, isso funciona e eu realmente espero

124
00:05:44,270 --> 00:05:48,060
‫que agora você tenha entendido exatamente como todo esse

125
00:05:48,060 --> 00:05:50,370
‫tratamento de erros funciona.

126
00:05:50,370 --> 00:05:53,300
‫Ok, então novamente criamos um erro e então passamos

127
00:05:53,300 --> 00:05:55,450
‫esse erro para o próximo e

128
00:05:55,450 --> 00:05:57,820
‫assim que o next receber algo, ele

129
00:05:57,820 --> 00:05:59,880
‫assume que é um erro

130
00:05:59,880 --> 00:06:00,757
‫e vai

131
00:06:00,757 --> 00:06:03,630
‫direto para o middleware de tratamento de erros

132
00:06:03,630 --> 00:06:06,683
‫global que enviará a resposta para nós , OK?

133
00:06:08,210 --> 00:06:09,850
‫Então, vamos copiar

134
00:06:09,850 --> 00:06:12,410
‫este e colocá-lo em todos os outros

135
00:06:12,410 --> 00:06:15,600
‫manipuladores que consultam documentos com base no ID.

136
00:06:15,600 --> 00:06:20,470
‫Então, não crie um tour, mas atualize um tour, ok?

137
00:06:20,470 --> 00:06:21,380
‫E assim,

138
00:06:21,380 --> 00:06:23,120
‫aqui mesmo, se estivermos tentando atualizar

139
00:06:23,120 --> 00:06:24,360
‫o tour que não

140
00:06:24,360 --> 00:06:26,773
‫existe, ele nos dará exatamente o mesmo erro.

141
00:06:29,210 --> 00:06:32,470
‫Finalmente, é claro, o mesmo com delete.

142
00:06:32,470 --> 00:06:35,870
‫E agora você vê que o ESLint me deu esse erro

143
00:06:35,870 --> 00:06:38,710
‫aqui e então, isso é porque esse tour não

144
00:06:38,710 --> 00:06:41,730
‫está definido e, neste caso, o ESLint realmente me salvou

145
00:06:41,730 --> 00:06:43,660
‫aqui de criar esse bug.

146
00:06:43,660 --> 00:06:44,550
‫Direito?

147
00:06:44,550 --> 00:06:46,790
‫Então, novamente sem o ESLint, eu

148
00:06:46,790 --> 00:06:48,570
‫provavelmente teria apenas colado aqui

149
00:06:48,570 --> 00:06:49,920
‫e encerrado o

150
00:06:49,920 --> 00:06:53,050
‫dia sem nem perceber que o tour não está

151
00:06:53,050 --> 00:06:54,600
‫definido em nenhum lugar

152
00:06:54,600 --> 00:06:57,830
‫dentro desta função, mas como instalamos essa ferramenta realmente valiosa,

153
00:06:57,830 --> 00:06:59,970
‫posso ir em frente e consertá-la.

154
00:06:59,970 --> 00:07:01,820
‫Tudo bem, então até

155
00:07:01,820 --> 00:07:06,490
‫este ponto, nós simplesmente aguardamos esta instrução de exclusão aqui e não salvamos

156
00:07:06,490 --> 00:07:08,460
‫o resultado dela e isso

157
00:07:08,460 --> 00:07:10,710
‫é simplesmente porque não precisávamos dela.

158
00:07:10,710 --> 00:07:13,200
‫Ok, mas agora realmente precisamos dela porque queremos

159
00:07:13,200 --> 00:07:15,140
‫esta variável de passeio a

160
00:07:15,140 --> 00:07:18,413
‫fim de verificar se realmente existe um passeio ou não.

161
00:07:21,460 --> 00:07:23,760
‫Então, muito fácil, const tour e igual

162
00:07:23,760 --> 00:07:25,350
‫a esse resultado, salve

163
00:07:25,350 --> 00:07:27,450
‫e aí o erro vai embora.

164
00:07:28,610 --> 00:07:29,820
‫Tão bom.

165
00:07:29,820 --> 00:07:32,770
‫ESLint no trabalho, certo?

166
00:07:32,770 --> 00:07:37,770
‫Agora, talvez você tenha percebido que não adicionei esse erro 404

167
00:07:37,950 --> 00:07:40,000
‫aqui neste manipulador getAllTour.

168
00:07:40,000 --> 00:07:41,910
‫Então, por que eu fiz isso?

169
00:07:41,910 --> 00:07:43,620
‫E então deixe-me explicar por quê.

170
00:07:43,620 --> 00:07:46,330
‫Então, quando nenhum resultado foi encontrado, por

171
00:07:46,330 --> 00:07:50,530
‫exemplo, não há resultados correspondentes para um filtro, ou porque a

172
00:07:50,530 --> 00:07:52,520
‫página solicitada que não

173
00:07:52,520 --> 00:07:55,970
‫existe, é claro que podemos considerar o envio de

174
00:07:55,970 --> 00:07:58,550
‫um erro 404 e dizer que os

175
00:07:58,550 --> 00:08:01,220
‫dados não foram encontrado, mas na minha

176
00:08:01,220 --> 00:08:03,760
‫opinião e também na opinião de outros

177
00:08:03,760 --> 00:08:07,170
‫desenvolvedores, isso não é totalmente correto neste pedido porque

178
00:08:07,170 --> 00:08:09,240
‫não houve realmente um erro.

179
00:08:09,240 --> 00:08:11,950
‫Quer dizer, o pedido foi recebido corretamente.

180
00:08:11,950 --> 00:08:14,550
‫O banco de dados pesquisou corretamente os passeios

181
00:08:14,550 --> 00:08:16,950
‫e encontrou exatamente zero registros e, portanto,

182
00:08:16,950 --> 00:08:19,150
‫esses zero registros são exatamente

183
00:08:19,150 --> 00:08:23,250
‫o que iremos enviar de volta junto com o código HTTP 200.

184
00:08:23,250 --> 00:08:25,120
‫Tudo bem, então, novamente, considero que

185
00:08:25,120 --> 00:08:27,300
‫não pode realmente haver um erro quando

186
00:08:27,300 --> 00:08:29,610
‫um usuário solicita todos os passeios, a menos

187
00:08:29,610 --> 00:08:32,680
‫que, é claro, haja alguma falha no banco de dados

188
00:08:32,680 --> 00:08:33,850
‫ou algo parecido.

189
00:08:33,850 --> 00:08:35,210
‫Mas, nesse caso,

190
00:08:35,210 --> 00:08:37,600
‫o Mongoose lançará automaticamente um erro.

191
00:08:37,600 --> 00:08:40,950
‫Certo, que por sua vez será capturado por nossa

192
00:08:40,950 --> 00:08:42,920
‫função ou catchAsync e, como

193
00:08:42,920 --> 00:08:44,330
‫você já sabe, manipulado

194
00:08:44,330 --> 00:08:47,510
‫em nosso manipulador de erros global e, como você

195
00:08:47,510 --> 00:08:48,800
‫já sabe,

196
00:08:48,800 --> 00:08:52,000
‫manipulado em nosso middleware de gerenciamento de erros global.

197
00:08:52,000 --> 00:08:55,640
‫Tudo bem, então eu já disse essas palavras tantas vezes agora.

198
00:08:55,640 --> 00:08:57,717
‫De qualquer forma, espero que

199
00:08:57,717 --> 00:09:01,113
‫tenha feito sentido e então, sim, vamos seguir em frente.

