﻿1
00:00:01,090 --> 00:00:04,280
‫Jonas: Configuremos ahora Multer según nuestras necesidades.

2
00:00:04,280 --> 00:00:07,380
‫Primero dando a las imágenes un mejor nombre de archivo,

3
00:00:07,380 --> 00:00:09,990
‫luego, en segundo lugar, permitiendo que solo se carguen

4
00:00:09,990 --> 00:00:12,193
‫archivos de imagen en nuestro servidor.

5
00:00:13,880 --> 00:00:15,640
‫Y para empezar, vamos a

6
00:00:15,640 --> 00:00:17,210
‫mover todas las cosas

7
00:00:17,210 --> 00:00:19,563
‫relacionadas con Multer de este enrutador al controlador.

8
00:00:21,910 --> 00:00:23,633
‫Así que cortemos esto

9
00:00:24,600 --> 00:00:27,220
‫aquí, y lo pondré aquí al final,

10
00:00:27,220 --> 00:00:30,570
‫o en realidad en la parte superior, ¿de acuerdo?

11
00:00:30,570 --> 00:00:32,710
‫Así que todo lo relacionado con

12
00:00:32,710 --> 00:00:35,263
‫Multer, lo pondremos aquí en la parte superior.

13
00:00:36,400 --> 00:00:41,400
‫Entonces también necesitamos, por supuesto, importar este paquete Multer.

14
00:00:44,940 --> 00:00:48,503
‫Y ahora también necesitamos crear un middleware con esto.

15
00:00:53,970 --> 00:00:56,393
‫Entonces exporta. uploadUserPhoto será

16
00:01:01,540 --> 00:01:03,253
‫igual a esto.

17
00:01:05,176 --> 00:01:07,890
‫Está bien, y todavía tenemos una función

18
00:01:07,890 --> 00:01:12,890
‫de middleware, pero ahora tiene su propio nombre más fácil de usar, ¿de acuerdo?

19
00:01:13,950 --> 00:01:16,880
‫Y aquí, userController. uploadPhoto, ¿de acuerdo?

20
00:01:20,460 --> 00:01:22,200
‫Así que se ve mucho mejor

21
00:01:22,200 --> 00:01:23,610
‫y, por supuesto, tiene

22
00:01:23,610 --> 00:01:25,950
‫sentido que este código esté en el controlador.

23
00:01:25,950 --> 00:01:28,010
‫Y ahora esto es agradable

24
00:01:28,010 --> 00:01:30,790
‫y limpio, y de hecho podemos cerrarlo ahora.

25
00:01:30,790 --> 00:01:33,260
‫Genial, y ahora vamos a

26
00:01:33,260 --> 00:01:36,400
‫configurar nuestra carga de Multer según nuestras necesidades.

27
00:01:36,400 --> 00:01:39,640
‫Y para eso vamos a crear un almacenamiento Multer

28
00:01:39,640 --> 00:01:41,950
‫y un filtro Multer, ¿de acuerdo?

29
00:01:41,950 --> 00:01:45,260
‫Y luego usaremos ese almacenamiento y el

30
00:01:45,260 --> 00:01:49,513
‫filtro para luego crear la carga desde allí, ¿de acuerdo?

31
00:01:50,400 --> 00:01:51,603
‫Así que hagámoslo aquí.

32
00:01:56,320 --> 00:02:01,053
‫Entonces, un multerStorage, usamos multer. almacenamiento de disco.

33
00:02:03,880 --> 00:02:05,760
‫Muy bien, y también podríamos optar

34
00:02:05,760 --> 00:02:08,560
‫por almacenar el archivo en la memoria como un

35
00:02:08,560 --> 00:02:11,670
‫búfer, para luego poder usarlo más tarde en otros procesos.

36
00:02:11,670 --> 00:02:14,050
‫Y de hecho lo haremos un poco

37
00:02:14,050 --> 00:02:16,700
‫más tarde, pero por ahora, por supuesto, queremos almacenar

38
00:02:16,700 --> 00:02:20,120
‫el archivo tal como está en nuestro sistema de archivos, ¿de acuerdo?

39
00:02:20,120 --> 00:02:23,690
‫Entonces, para el almacenamiento en disco, tomaremos un par de opciones,

40
00:02:23,690 --> 00:02:25,693
‫y la primera es el destino.

41
00:02:27,900 --> 00:02:31,390
‫Pero ahora no podemos simplemente establecerlo en este camino como

42
00:02:31,390 --> 00:02:32,850
‫lo hicimos antes.

43
00:02:32,850 --> 00:02:35,760
‫No, esto es un poco más complejo, ¿de acuerdo?

44
00:02:35,760 --> 00:02:39,550
‫Y entonces, realmente, este destino aquí es una función de devolución

45
00:02:39,550 --> 00:02:41,400
‫de llamada que es así.

46
00:02:41,400 --> 00:02:45,610
‫Entonces, esta función de devolución de llamada tiene acceso a la solicitud actual,

47
00:02:45,610 --> 00:02:47,750
‫al archivo cargado actualmente y también a

48
00:02:47,750 --> 00:02:49,820
‫una función de devolución de llamada.

49
00:02:49,820 --> 00:02:51,330
‫Y esta función de devolución de

50
00:02:51,330 --> 00:02:53,720
‫llamada es un poco como la siguiente función en Express.

51
00:02:53,720 --> 00:02:56,810
‫Pero lo llamo cb aquí, que significa devolución de llamada, por

52
00:02:56,810 --> 00:02:58,790
‫lo que es un nombre diferente

53
00:02:58,790 --> 00:03:02,000
‫al siguiente, porque en realidad no proviene de Express, ¿de acuerdo?

54
00:03:02,000 --> 00:03:05,070
‫Pero es similar en que podemos pasar errores aquí y

55
00:03:05,070 --> 00:03:07,683
‫otras cosas, como verá en un segundo.

56
00:03:10,830 --> 00:03:12,730
‫Entonces, para definir ahora el

57
00:03:12,730 --> 00:03:15,640
‫destino, en realidad necesitamos llamar a esa devolución de llamada.

58
00:03:15,640 --> 00:03:18,730
‫Entonces, la devolución de llamada, y luego el primer argumento es un

59
00:03:18,730 --> 00:03:19,820
‫error si hay uno.

60
00:03:19,820 --> 00:03:21,523
‫Y si no, simplemente nulo.

61
00:03:22,910 --> 00:03:25,943
‫Y el segundo argumento es entonces el destino real.

62
00:03:26,810 --> 00:03:28,260
‫Copiemos eso

63
00:03:29,180 --> 00:03:31,333
‫de aquí y peguemos aquí.

64
00:03:32,500 --> 00:03:37,500
‫Muy bien, y nuevamente, todo esto parece un poco extraño y complejo, y echemos

65
00:03:37,820 --> 00:03:39,130
‫un vistazo a

66
00:03:39,130 --> 00:03:41,433
‫la documentación de Multer en GitHub.

67
00:03:48,860 --> 00:03:50,970
‫Bien, y si necesita obtener

68
00:03:50,970 --> 00:03:54,570
‫más información, puede echar un vistazo a esta documentación aquí.

69
00:03:54,570 --> 00:03:56,890
‫Y como puede ver,

70
00:03:56,890 --> 00:04:01,890
‫con 6.000 estrellas, en realidad es un paquete bastante popular.

71
00:04:02,090 --> 00:04:04,293
‫Entonces aquí puedes aprender a usarlo.

72
00:04:05,270 --> 00:04:07,090
‫Pero, de hecho, lo que encontrará

73
00:04:07,090 --> 00:04:08,700
‫aquí es algo así como

74
00:04:08,700 --> 00:04:11,283
‫lo que haremos durante las próximas conferencias, ¿de acuerdo?

75
00:04:12,290 --> 00:04:15,000
‫Entonces esto parece mucho más confuso de lo

76
00:04:15,000 --> 00:04:17,350
‫que vamos a hacer, ¿de acuerdo?

77
00:04:17,350 --> 00:04:18,750
‫Pero ves que esto

78
00:04:18,750 --> 00:04:22,820
‫es realmente lo que estamos haciendo actualmente, por lo que estamos configurando

79
00:04:22,820 --> 00:04:26,580
‫el destino y, a continuación, también configuraremos el nombre del archivo.

80
00:04:26,580 --> 00:04:30,250
‫Así que hagámoslo, y nuevamente, si desea obtener más información,

81
00:04:30,250 --> 00:04:33,400
‫solo eche un vistazo a esa documentación.

82
00:04:33,400 --> 00:04:37,840
‫Pero por ahora quiero establecer la propiedad del nombre de archivo.

83
00:04:37,840 --> 00:04:41,593
‫Entonces no es eso, simplemente nombre de archivo.

84
00:04:42,610 --> 00:04:45,980
‫Y nuevamente, esa es una función de devolución

85
00:04:45,980 --> 00:04:50,973
‫de llamada muy similar con una firma, solicitud, archivo y devolución de llamada similares.

86
00:04:54,540 --> 00:04:57,980
‫Y ahora queremos dar a nuestros archivos algunos nombres de archivo únicos.

87
00:04:57,980 --> 00:04:59,380
‫Y la forma

88
00:04:59,380 --> 00:05:04,380
‫en que voy a hacer eso es llamarlos user-userid, la marca de tiempo actual.

89
00:05:04,990 --> 00:05:07,720
‫Entonces algo como esto: entonces usuario-, y

90
00:05:07,720 --> 00:05:11,793
‫luego la ID, que es así de extraño, algo como esto.

91
00:05:14,190 --> 00:05:16,640
‫Correcto, y luego la marca de

92
00:05:16,640 --> 00:05:19,880
‫tiempo actual, que será un número enorme, algo como

93
00:05:19,880 --> 00:05:23,490
‫esto, y luego, por supuesto, la extensión del archivo, ¿de acuerdo?

94
00:05:23,490 --> 00:05:25,730
‫Y con esto básicamente podemos garantizar

95
00:05:25,730 --> 00:05:29,030
‫que no habrá dos imágenes con el mismo nombre de archivo.

96
00:05:29,030 --> 00:05:31,290
‫Si usamos solo el ID

97
00:05:31,290 --> 00:05:33,820
‫de usuario, entonces, por supuesto, múltiples cargas

98
00:05:33,820 --> 00:05:36,140
‫del mismo usuario anularían la imagen anterior.

99
00:05:36,140 --> 00:05:39,770
‫Y si solo usáramos usuario con la marca de tiempo, bueno,

100
00:05:39,770 --> 00:05:43,210
‫entonces si dos usuarios estuvieran cargando una imagen al mismo tiempo,

101
00:05:43,210 --> 00:05:45,920
‫obtendrían exactamente el mismo nombre de archivo, lo

102
00:05:45,920 --> 00:05:47,393
‫cual no tiene sentido.

103
00:05:48,630 --> 00:05:51,300
‫Muy bien, primero que nada,

104
00:05:51,300 --> 00:05:55,330
‫extraigamos el nombre del archivo del archivo cargado.

105
00:05:55,330 --> 00:05:57,060
‫¿Y cómo lo conseguimos?

106
00:05:57,060 --> 00:05:59,963
‫Bueno, echemos un vistazo a la salida de nuestra consola

107
00:06:03,080 --> 00:06:06,120
‫aquí, donde tuvimos la solicitud. archivo hace mucho tiempo.

108
00:06:06,120 --> 00:06:09,080
‫Así que aquí está, así que recuerde que este objeto

109
00:06:09,080 --> 00:06:11,830
‫aquí fue una solicitud. archivo, y eso

110
00:06:11,830 --> 00:06:15,530
‫es exactamente lo que es este archivo aquí, ¿de acuerdo?

111
00:06:15,530 --> 00:06:18,260
‫Y aquí tenemos el tipo

112
00:06:18,260 --> 00:06:22,087
‫MIME, y ese JPEG se almacena aquí, ¿de acuerdo?

113
00:06:22,087 --> 00:06:24,030
‫Y de aquí es de donde obtendremos

114
00:06:24,030 --> 00:06:25,363
‫la extensión de archivo.

115
00:06:28,130 --> 00:06:33,130
‫Entonces la extensión es igual al archivo. mimetype, y luego dividamos

116
00:06:35,290 --> 00:06:39,550
‫esa cadena por la barra, y tomemos el

117
00:06:39,550 --> 00:06:42,720
‫segundo elemento de la matriz resultante.

118
00:06:42,720 --> 00:06:46,853
‫Y entonces esa será solo esta parte, entonces solo esto.

119
00:06:47,780 --> 00:06:50,500
‫Muy bien, esa es la extensión.

120
00:06:50,500 --> 00:06:52,100
‫Y ahora, como antes,

121
00:06:52,100 --> 00:06:56,760
‫necesitamos llamar a la función de devolución de llamada sin error, y luego

122
00:06:56,760 --> 00:06:59,423
‫el nombre de archivo que queremos especificar.

123
00:07:00,460 --> 00:07:05,460
‫Entonces, ese será el usuario, luego la identificación del usuario, ¿recuerdas?

124
00:07:06,890 --> 00:07:09,970
‫Y como tenemos acceso a la solicitud aquí, es

125
00:07:09,970 --> 00:07:13,913
‫muy simple, solicitud. usuario. identificación.

126
00:07:14,830 --> 00:07:16,620
‫Y como ya sabe, esa es

127
00:07:16,620 --> 00:07:19,040
‫la identificación del usuario que ha iniciado sesión actualmente.

128
00:07:19,040 --> 00:07:24,040
‫Luego, la marca de tiempo, entonces Date. ahora, de acuerdo, y

129
00:07:25,547 --> 00:07:30,547
‫luego puntee la extensión que acabamos de crear, ¿de acuerdo?

130
00:07:33,120 --> 00:07:35,410
‫Así que eliminemos este comentario,

131
00:07:35,410 --> 00:07:37,780
‫y ese es en realidad nuestro almacenamiento.

132
00:07:37,780 --> 00:07:40,310
‫Y así, básicamente, una definición completa de cómo

133
00:07:40,310 --> 00:07:42,540
‫queremos almacenar nuestros archivos, con

134
00:07:42,540 --> 00:07:44,963
‫el destino y el nombre del archivo.

135
00:07:46,270 --> 00:07:48,833
‫A continuación, creemos un filtro Multer.

136
00:07:52,270 --> 00:07:53,983
‫Así que llamémoslo exactamente así.

137
00:07:57,200 --> 00:08:00,370
‫Y el filtro en Multer es simplemente, nuevamente, una

138
00:08:00,370 --> 00:08:04,010
‫función de devolución de llamada, similar a las que teníamos antes,

139
00:08:04,010 --> 00:08:08,433
‫accediendo a la solicitud, el archivo y una función de devolución de llamada.

140
00:08:09,850 --> 00:08:11,730
‫Y en esta función, el objetivo

141
00:08:11,730 --> 00:08:14,660
‫es básicamente probar si el archivo subido es una imagen.

142
00:08:14,660 --> 00:08:17,220
‫Y si es así, pasamos verdadero a la función de

143
00:08:17,220 --> 00:08:19,010
‫devolución de llamada, y si no

144
00:08:19,010 --> 00:08:22,110
‫es así, pasamos falso a la función de devolución de llamada,

145
00:08:22,110 --> 00:08:23,410
‫junto con un error.

146
00:08:23,410 --> 00:08:25,810
‫Porque nuevamente, no queremos permitir que se

147
00:08:25,810 --> 00:08:28,020
‫carguen archivos que no sean imágenes.

148
00:08:28,020 --> 00:08:31,370
‫Y eso es exactamente para lo que es este filtro.

149
00:08:31,370 --> 00:08:33,090
‫Ahora, si en su

150
00:08:33,090 --> 00:08:36,830
‫propia aplicación desea cargar algo más, digamos archivos CSV, cuando entonces,

151
00:08:36,830 --> 00:08:40,260
‫por supuesto, puede probar eso en lugar de imágenes.

152
00:08:40,260 --> 00:08:42,240
‫Entonces, todo lo que estamos haciendo

153
00:08:42,240 --> 00:08:43,960
‫aquí funciona no solo

154
00:08:43,960 --> 00:08:45,790
‫para imágenes, sino también para todo

155
00:08:45,790 --> 00:08:48,090
‫tipo de archivos que desea cargar, ¿de acuerdo?

156
00:08:48,090 --> 00:08:51,610
‫Ahora de nuevo, en este caso realmente estamos hablando de imágenes, así

157
00:08:51,610 --> 00:08:54,640
‫que probemos si el archivo subido es una imagen.

158
00:08:54,640 --> 00:08:58,410
‫Y para eso usaremos una vez más el tipo MIME, porque sea

159
00:08:58,410 --> 00:09:00,770
‫cual sea el tipo de imagen

160
00:09:00,770 --> 00:09:05,300
‫que se cargue, así que no importa si es un JPEG, PNG, o un

161
00:09:05,300 --> 00:09:07,730
‫mapa de bits, o un TIFF, o

162
00:09:07,730 --> 00:09:10,950
‫realmente cualquier cosa, el tipo MIME siempre comenzará con image.

163
00:09:10,950 --> 00:09:13,170
‫Y ahora podemos probar eso.

164
00:09:13,170 --> 00:09:17,643
‫Entonces, si file. tipo de Mimica. startsWith, image, por lo

165
00:09:21,890 --> 00:09:25,910
‫que no estoy seguro de si hemos usado este antes, pero es

166
00:09:25,910 --> 00:09:29,700
‫un método de cadena bastante nuevo y muy útil que está

167
00:09:29,700 --> 00:09:31,750
‫disponible en JavaScript, por lo que

168
00:09:31,750 --> 00:09:33,593
‫en todo JavaScript en general.

169
00:09:34,770 --> 00:09:38,650
‫Entonces, en caso de que realmente tengamos una imagen, bueno,

170
00:09:38,650 --> 00:09:42,090
‫entonces nuevamente no hay error y pasamos verdadero,

171
00:09:42,090 --> 00:09:43,810
‫como dije al principio.

172
00:09:43,810 --> 00:09:48,810
‫Pero de lo contrario, pasaremos un error y luego

173
00:09:50,520 --> 00:09:52,080
‫un falso.

174
00:09:52,080 --> 00:09:55,320
‫Así que pongamos una x aquí y sea falso.

175
00:09:55,320 --> 00:09:58,910
‫Entonces, para esta x aquí, ahora crearemos un AppError, tal como lo

176
00:09:58,910 --> 00:10:01,010
‫hemos estado haciendo todo el tiempo.

177
00:10:01,010 --> 00:10:03,423
‫Y de hecho ya lo tenemos aquí.

178
00:10:04,470 --> 00:10:07,643
‫Entonces, digamos

179
00:10:10,522 --> 00:10:14,896
‫un nuevo AppError, no una

180
00:10:14,896 --> 00:10:19,896
‫imagen, cargue solo imágenes, ¿de acuerdo?

181
00:10:20,709 --> 00:10:23,459
‫Y luego un 400 por una mala solicitud.

182
00:10:24,876 --> 00:10:28,875
‫Genial, tenemos nuestro almacenamiento, tenemos nuestro filtro, ahora es

183
00:10:28,875 --> 00:10:30,567
‫el momento de

184
00:10:30,567 --> 00:10:33,294
‫usarlos para crear la carga.

185
00:10:33,294 --> 00:10:37,228
‫De acuerdo, la carga ahora no se verá

186
00:10:37,228 --> 00:10:40,816
‫así, sino que pasaremos estas variables.

187
00:10:40,816 --> 00:10:44,149
‫Entonces, en Multer podemos especificar el almacenamiento,

188
00:10:46,618 --> 00:10:49,368
‫y ese es nuestro multerStorage.

189
00:10:52,118 --> 00:10:54,118
‫Y luego el

190
00:10:57,109 --> 00:11:01,276
‫fileFilter, que es la variable que llamamos multerFilter.

191
00:11:02,439 --> 00:11:04,299
‫Está bien, y eso es todo.

192
00:11:04,299 --> 00:11:06,486
‫Y, por supuesto, podríamos haber

193
00:11:06,486 --> 00:11:10,225
‫puesto todo esto aquí directamente en este objeto de opciones aquí.

194
00:11:10,225 --> 00:11:12,901
‫Pero generalmente prefiero hacer esto afuera

195
00:11:12,901 --> 00:11:17,076
‫y luego simplemente pasar las variables a un objeto de opciones.

196
00:11:17,076 --> 00:11:19,351
‫Entonces eso se ve un poco más limpio.

197
00:11:19,351 --> 00:11:22,241
‫Así que estos son muchos pasos

198
00:11:22,241 --> 00:11:26,046
‫que debemos seguir para crear realmente nuestro middleware Multer.

199
00:11:26,046 --> 00:11:27,953
‫Pero finalmente, por supuesto, como

200
00:11:27,953 --> 00:11:29,770
‫hicimos en el

201
00:11:29,770 --> 00:11:33,169
‫último video, usamos esta carga, y en eso llamamos

202
00:11:33,169 --> 00:11:35,437
‫single, con el nombre del campo.

203
00:11:35,437 --> 00:11:38,688
‫Entonces foto, y luego desde allí creamos una exportación,

204
00:11:38,688 --> 00:11:41,262
‫o middleware, que en realidad ya incluimos

205
00:11:41,262 --> 00:11:42,880
‫en nuestro enrutador.

206
00:11:42,880 --> 00:11:46,845
‫Así que eliminemos ahora este viejo tipo de imagen

207
00:11:46,845 --> 00:11:48,845
‫que teníamos aquí antes.

208
00:11:50,649 --> 00:11:52,399
‫No, eso no funcionó.

209
00:11:54,543 --> 00:11:57,569
‫Y ahora probémoslo aquí de nuevo.

210
00:11:57,569 --> 00:12:00,637
‫De vuelta en Postman, todavía tenemos nuestro nombre aquí

211
00:12:00,637 --> 00:12:03,554
‫y la imagen de Leo, así que vamos.

212
00:12:05,556 --> 00:12:08,473
‫Y no obtuvimos ningún error, lo cual es bueno.

213
00:12:10,516 --> 00:12:13,516
‫Y veamos nuestra salida aquí nuevamente.

214
00:12:16,428 --> 00:12:19,240
‫Así que todo aquí al principio es

215
00:12:19,240 --> 00:12:23,827
‫igual, pero luego ves que nuestro nombre de archivo ahora es correcto.

216
00:12:23,827 --> 00:12:26,465
‫Y si echa un vistazo a nuestra

217
00:12:26,465 --> 00:12:28,948
‫carpeta, entonces está nuestra imagen.

218
00:12:28,948 --> 00:12:31,934
‫Y ese es exactamente el que subimos.

219
00:12:31,934 --> 00:12:34,934
‫Eso está en dev-data, imágenes, Leo.

220
00:12:37,649 --> 00:12:41,288
‫Y de hecho, eso es exactamente lo mismo.

221
00:12:41,288 --> 00:12:43,724
‫Genial, eso es asombroso.

222
00:12:43,724 --> 00:12:46,615
‫Ahora, solo para probar este filtro

223
00:12:46,615 --> 00:12:51,615
‫aquí también, intentemos cargar algún otro archivo que no sea una imagen.

224
00:12:51,974 --> 00:12:56,516
‫Entonces, seleccionemos algo más aquí de nuestros datos de

225
00:12:56,516 --> 00:13:00,278
‫desarrollo, y digamos simplemente algunos datos JSON.

226
00:13:00,278 --> 00:13:04,336
‫Entonces, esperemos si obtenemos un error aquí.

227
00:13:04,336 --> 00:13:06,190
‫Y de hecho obtenemos uno.

228
00:13:06,190 --> 00:13:09,070
‫Así que no es una imagen, cargue solo imágenes.

229
00:13:09,070 --> 00:13:11,643
‫Y entonces significa que eso también funciona.

230
00:13:12,610 --> 00:13:16,200
‫Tan perfecto, toda nuestra configuración Multer ahora funciona

231
00:13:16,200 --> 00:13:18,540
‫realmente bien, pero por supuesto

232
00:13:18,540 --> 00:13:20,480
‫todavía falta un paso.

233
00:13:20,480 --> 00:13:22,660
‫Y eso es realmente vincular

234
00:13:22,660 --> 00:13:25,550
‫al usuario a la imagen recién actualizada, ¿verdad?

235
00:13:25,550 --> 00:13:27,660
‫Porque en este momento en la

236
00:13:27,660 --> 00:13:29,420
‫base de datos, obviamente todavía

237
00:13:29,420 --> 00:13:31,840
‫tenemos la ruta, o en realidad el nombre

238
00:13:31,840 --> 00:13:34,460
‫de la imagen anterior, porque en ninguna parte

239
00:13:34,460 --> 00:13:38,180
‫de nuestro código especificamos que queríamos actualizar el documento del usuario, ¿verdad?

240
00:13:38,180 --> 00:13:40,603
‫Y arreglemos eso en el siguiente video.

