<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Isaac Zepeda</title>
    <description>The latest articles on Forem by Isaac Zepeda (@keogh).</description>
    <link>https://forem.com/keogh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F411028%2F106929f4-a592-43ee-b026-6579cb5a44e9.png</url>
      <title>Forem: Isaac Zepeda</title>
      <link>https://forem.com/keogh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/keogh"/>
    <language>en</language>
    <item>
      <title>El Curioso Caso del Dashboard Desaparecido en CapRover</title>
      <dc:creator>Isaac Zepeda</dc:creator>
      <pubDate>Sun, 27 Oct 2024 23:15:57 +0000</pubDate>
      <link>https://forem.com/keogh/el-curioso-caso-del-dashboard-desaparecido-en-caprover-2e0a</link>
      <guid>https://forem.com/keogh/el-curioso-caso-del-dashboard-desaparecido-en-caprover-2e0a</guid>
      <description>&lt;p&gt;Hay algo emocionante en resolver misterios técnicos; para muchos de nosotros, resolver estos enigmas digitales es igual de frustrante que gratificante. Recientemente, me encontré con uno de estos desafíos: un servidor de CapRover que dejó de mostrar su dashboard, lanzando un misterioso error &lt;code&gt;ERR_HTTP2_PROTOCOL_ERROR&lt;/code&gt;. Lo que siguió fue una inmersión profunda en los servicios de Docker, registros de logs, y una eventual confrontación con un culpable que suele pasarse por alto: el espacio en disco.&lt;/p&gt;

&lt;p&gt;Aquí te comparto la historia de cómo diagnosticamos, probamos y finalmente solucionamos el problema. Si eres usuario de CapRover o simplemente te gustan las buenas historias de solución de problemas, sigue leyendo para conocer toda la historia.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Los Primeros Síntomas&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nuestra historia comienza cuando el dashboard de CapRover dejó de responder repentinamente. En lugar de la interfaz familiar, solo se mostraba una pantalla en blanco. En los registros de la consola aparecía el mensaje &lt;code&gt;ERR_HTTP2_PROTOCOL_ERROR&lt;/code&gt;, lo cual parecía inusual. En los registros de Docker de CapRover, el servicio &lt;code&gt;captain-certbot&lt;/code&gt; parecía tener problemas, atrapado en un bucle de intentos para obtener el ID del contenedor.&lt;/p&gt;

&lt;p&gt;Certbot, la parte de CapRover encargada de los certificados SSL, no podía ejecutarse correctamente. Aunque los problemas de Certbot no son desconocidos, este caso era extraño porque el problema no solo era de SSL; el dashboard entero se negaba a cargar. Este indicio nos llevó a pensar que podría haber un problema subyacente más amplio.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Los Primeros Pasos: Una Serie de Experimentos&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Cuando se trata de solucionar problemas en CapRover, reiniciar los servicios suele ser un buen primer paso. Reiniciar los servicios &lt;code&gt;captain-captain&lt;/code&gt; y &lt;code&gt;captain-certbot&lt;/code&gt; podría ayudar a eliminar errores temporales. Esto es lo que probamos primero:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reinicio de Servicios&lt;/strong&gt;: Utilizamos comandos para actualizar y reiniciar los contenedores &lt;code&gt;captain-captain&lt;/code&gt; y &lt;code&gt;captain-certbot&lt;/code&gt;, con la esperanza de que regresaran a su funcionamiento normal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intentos Directos de Renovación de SSL&lt;/strong&gt;: Cuando los servicios de CapRover no respondieron, intentamos acceder a &lt;code&gt;captain-certbot&lt;/code&gt; directamente para renovar el certificado SSL con &lt;code&gt;certbot renew --force-renewal&lt;/code&gt;. Desafortunadamente, este comando devolvió un error inesperado, lo que indicaba problemas con el propio Certbot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eliminar y Recrear Contenedores&lt;/strong&gt;: Incluso eliminamos instancias adicionales del contenedor &lt;code&gt;captain-certbot&lt;/code&gt;, sospechando que los contenedores redundantes podrían estar generando conflictos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pero cada intento nos llevaba de nuevo al punto de partida y nada parecía restaurar el dashboard de CapRover. En este punto, recurrimos a un último posible problema: el espacio en disco.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;El Momento Eureka: Problemas de Espacio en Disco&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Finalmente, decidimos verificar el uso del disco del servidor utilizando &lt;code&gt;df -h&lt;/code&gt;. La salida reveló el verdadero problema en números alarmantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        23G   23G     0 100% /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡El sistema de archivos raíz de nuestro servidor estaba completamente lleno! Esto explicaba por qué Certbot y NGINX fallaban: simplemente no había espacio disponible para que operaran.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;La Solución: Liberando Espacio en Disco&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Con la causa raíz identificada, ahora nos enfocamos en liberar suficiente espacio para que CapRover volviera a funcionar. Esto fue lo que hicimos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limpiar el Sistema de Docker&lt;/strong&gt;: Primero, eliminamos los recursos no utilizados de Docker:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;--volumes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto eliminó imágenes, contenedores, redes y volúmenes no utilizados, lo que liberó espacio, pero no lo suficiente como para resolver el problema completamente.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limpieza de Logs&lt;/strong&gt;: Los logs pueden consumir mucho espacio, así que recurrimos a los logs del sistema:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;--vacuum-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100M
   &lt;span class="nb"&gt;sudo &lt;/span&gt;find /var/log &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;truncate&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; 0 &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También truncamos los registros de contenedores de Docker, estableciéndolos en 0 bytes sin eliminarlos, liberando valiosos megabytes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limpieza de Caché de Paquetes&lt;/strong&gt;: Luego, limpiamos las cachés de paquetes del sistema, que pueden crecer mucho con el tiempo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eliminación de Archivos Temporales Antiguos&lt;/strong&gt;: Finalmente, eliminamos archivos temporales y paquetes no utilizados:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /tmp/&lt;span class="k"&gt;*&lt;/span&gt;
   &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/tmp/&lt;span class="k"&gt;*&lt;/span&gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de esta meticulosa limpieza, liberamos más de &lt;strong&gt;14 GB&lt;/strong&gt; en el servidor, reduciendo el uso al 39%.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;El Resultado: Un Servidor CapRover Saludable&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Con el problema de espacio en disco resuelto, reiniciamos el servicio &lt;code&gt;captain-captain&lt;/code&gt; para asegurar que CapRover pudiera utilizar el espacio recién liberado. Esta vez, el dashboard cargó sin problemas. Certbot renovó los certificados SSL sin inconvenientes, y NGINX manejó las solicitudes como se esperaba.&lt;/p&gt;

&lt;p&gt;Al final, el misterio estaba resuelto: el disco lleno había causado toda la serie de errores, desde los fallos en la renovación de SSL hasta los errores de protocolo HTTP. Al investigar cada posible causa y no pasar por alto el factor de espacio en disco, logramos restaurar el servidor por completo.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Lecciones de la Experiencia&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;El Espacio en Disco es Importante&lt;/strong&gt;: El espacio en disco es una causa de problemas que suele pasarse por alto, especialmente en servidores que ejecutan aplicaciones en contenedores. Un monitoreo regular puede evitar estos problemas antes de que comiencen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solución de Problemas Paso a Paso&lt;/strong&gt;: En lugar de hacer suposiciones, un enfoque sistemático ayuda a reducir rápidamente el problema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Los Logs son tus Aliados&lt;/strong&gt;: Aunque los logs pueden parecer poco útiles a veces, pueden llevarte a la causa raíz mostrando lo que no está sucediendo (como la imposibilidad de Certbot de avanzar).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limpieza Regular de Docker&lt;/strong&gt;: Los entornos de Docker se benefician de limpiezas periódicas, ya que los recursos no utilizados pueden acumularse con el tiempo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Al final, lo que comenzó como un error misterioso se convirtió en una solución sencilla, aunque algo tediosa. Y aunque tomó tiempo llegar a la raíz del problema, la experiencia reforzó una de las lecciones más valiosas de la solución de problemas: &lt;strong&gt;nunca pases por alto lo básico&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>caprover</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>Cómo solucionar el error de CORS orign en Django</title>
      <dc:creator>Isaac Zepeda</dc:creator>
      <pubDate>Tue, 01 Oct 2024 14:18:29 +0000</pubDate>
      <link>https://forem.com/keogh/como-solucionar-el-error-de-cors-orign-en-django-3682</link>
      <guid>https://forem.com/keogh/como-solucionar-el-error-de-cors-orign-en-django-3682</guid>
      <description>&lt;p&gt;El error &lt;strong&gt;CORS (Cross-Origin Resource Sharing)&lt;/strong&gt; o Intercambio de Recursos de Origen Cruzado ocurre cuando tu frontend (o cualquier otra aplicación) intenta acceder a tu API de Django desde un dominio o puerto diferente, y el servidor de la API no está configurado para permitir estas solicitudes.&lt;/p&gt;

&lt;p&gt;Para resolver el error CORS en tu proyecto de Django, necesitas instalar el paquete &lt;strong&gt;&lt;a href="https://pypi.org/project/django-cors-headers/" rel="noopener noreferrer"&gt;django-cors-headers&lt;/a&gt;&lt;/strong&gt; y configurarlo en tu archivo &lt;code&gt;settings.py&lt;/code&gt; para permitir solicitudes desde orígenes específicos o desde todos los orígenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es CORS y por qué es importante?
&lt;/h2&gt;

&lt;p&gt;CORS es un mecanismo de seguridad implementado por los navegadores web para proteger a los usuarios de posibles ataques maliciosos. Sin embargo, este mecanismo también puede impedir que aplicaciones legítimas se comuniquen entre sí si no están correctamente configuradas.&lt;/p&gt;

&lt;p&gt;En la ingeniería de software moderna, es común tener el frontend y el backend en servidores diferentes. Por ejemplo, podrías tener tu aplicación React ejecutándose en &lt;code&gt;http://localhost:3000&lt;/code&gt; y tu API de Django en &lt;code&gt;http://localhost:8000&lt;/code&gt;. Sin la configuración adecuada de CORS, el navegador bloqueará las solicitudes entre estos dos orígenes por razones de seguridad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pasos para resolver el problema de CORS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Instalar &lt;code&gt;django-cors-headers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Primero, necesitas instalar el paquete &lt;code&gt;django-cors-headers&lt;/code&gt; para manejar CORS en Django. Ejecuta el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;django-cors-headers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes agregar esta dependencia a tu archivo &lt;code&gt;requirements.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;django-cors-headers==4.4.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Agregar &lt;code&gt;django-cors-headers&lt;/code&gt; a las aplicaciones instaladas
&lt;/h3&gt;

&lt;p&gt;Una vez instalado, agrega &lt;code&gt;corsheaders&lt;/code&gt; a tu lista de &lt;code&gt;INSTALLED_APPS&lt;/code&gt; en el archivo &lt;code&gt;settings.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Otras aplicaciones instaladas...
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;corsheaders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Agregar &lt;code&gt;CorsMiddleware&lt;/code&gt; a Middleware
&lt;/h3&gt;

&lt;p&gt;El siguiente paso es agregar &lt;code&gt;CorsMiddleware&lt;/code&gt; a tu middleware en &lt;code&gt;settings.py&lt;/code&gt;. Este middleware debe agregarse &lt;strong&gt;antes&lt;/strong&gt; de &lt;code&gt;CommonMiddleware&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MIDDLEWARE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Otros middleware...
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;corsheaders.middleware.CorsMiddleware&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django.middleware.common.CommonMiddleware&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# Otros middleware...
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Configurar CORS en &lt;code&gt;settings.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ahora necesitas configurar CORS para permitir solicitudes desde ciertos dominios o desde todos los dominios.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Para permitir todos los orígenes (no recomendado para producción):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="n"&gt;CORS_ALLOW_ALL_ORIGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Para permitir orígenes específicos:&lt;/strong&gt;
Puedes especificar una lista de orígenes permitidos configurando la opción &lt;code&gt;CORS_ALLOWED_ORIGINS&lt;/code&gt;. Por ejemplo, si tu frontend se ejecuta en &lt;code&gt;http://localhost:3000&lt;/code&gt;, puedes permitir ese origen así:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="n"&gt;CORS_ALLOWED_ORIGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tu-dominio-de-produccion.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Permitir encabezados CORS para cookies (opcional)
&lt;/h3&gt;

&lt;p&gt;Si estás trabajando con cookies para autenticación (por ejemplo, con autenticación de sesión), también necesitas configurar lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CORS_ALLOW_CREDENTIALS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permitirá que las credenciales (como cookies, encabezados de autorización o certificados de cliente TLS) se envíen en solicitudes de origen cruzado.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Permitir métodos HTTP (opcional)
&lt;/h3&gt;

&lt;p&gt;Por defecto, se permiten los métodos HTTP más comunes (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;OPTIONS&lt;/code&gt;). Sin embargo, si necesitas restringir o permitir otros métodos, puedes especificarlos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CORS_ALLOW_METHODS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;DELETE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OPTIONS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PATCH&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PUT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Permitir encabezados HTTP (opcional)
&lt;/h3&gt;

&lt;p&gt;Si quieres permitir encabezados específicos en las solicitudes, puedes configurarlo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CORS_ALLOW_HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;authorization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content-type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x-csrftoken&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;accept&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;origin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user-agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ejemplo de configuración completa de CORS en &lt;code&gt;settings.py&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Aquí tienes un ejemplo de configuración con &lt;code&gt;django-cors-headers&lt;/code&gt; agregado a la configuración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Otras aplicaciones...,
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;corsheaders&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# Otras aplicaciones...
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;MIDDLEWARE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# Otros middleware...,
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;corsheaders.middleware.CorsMiddleware&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django.middleware.common.CommonMiddleware&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# Otros middleware...
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Permitir todos los orígenes (para desarrollo)
# CORS_ALLOW_ALL_ORIGINS = True
&lt;/span&gt;
&lt;span class="c1"&gt;# O, si quieres permitir orígenes específicos:
&lt;/span&gt;&lt;span class="n"&gt;CORS_ALLOWED_ORIGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Frontend en localhost (React/Vue/Angular)
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tu-dominio-de-produccion.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Opcional: Para permitir credenciales como cookies, encabezados de sesión
&lt;/span&gt;&lt;span class="n"&gt;CORS_ALLOW_CREDENTIALS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reiniciar tu servidor
&lt;/h2&gt;

&lt;p&gt;Después de actualizar tu &lt;code&gt;settings.py&lt;/code&gt;, asegúrate de reiniciar tu servidor Django para que se apliquen las nuevas configuraciones de CORS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consideraciones de seguridad
&lt;/h2&gt;

&lt;p&gt;Es importante tener en cuenta que permitir CORS desde cualquier origen (&lt;code&gt;CORS_ALLOW_ALL_ORIGINS = True&lt;/code&gt;) puede representar un riesgo de seguridad en un entorno de producción. Siempre es mejor especificar explícitamente los orígenes permitidos utilizando &lt;code&gt;CORS_ALLOWED_ORIGINS&lt;/code&gt; en producción.&lt;/p&gt;

&lt;p&gt;Además, si estás utilizando &lt;code&gt;CORS_ALLOW_CREDENTIALS = True&lt;/code&gt;, es crucial que configures cuidadosamente &lt;code&gt;CORS_ALLOWED_ORIGINS&lt;/code&gt; y no uses &lt;code&gt;CORS_ALLOW_ALL_ORIGINS = True&lt;/code&gt;, ya que esto podría permitir ataques de tipo CSRF (Cross-Site Request Forgery).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Al instalar &lt;code&gt;django-cors-headers&lt;/code&gt; y configurar los orígenes permitidos en tu &lt;code&gt;settings.py&lt;/code&gt;, puedes resolver el error CORS y permitir solicitudes de origen cruzado desde tu frontend a tu API de Django. Asegúrate de restringir los orígenes permitidos en producción para mejorar la seguridad.&lt;/p&gt;

&lt;p&gt;La configuración adecuada de CORS es esencial para el desarrollo de aplicaciones web modernas, especialmente cuando se trabaja con arquitecturas de frontend y backend separados. Con estos pasos, deberías poder resolver los problemas de CORS en tu aplicación Django y permitir una comunicación fluida entre tu frontend y tu API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos adicionales
&lt;/h2&gt;

&lt;p&gt;Para obtener más información sobre CORS y su implementación en Django, puedes consultar los siguientes recursos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Documentación oficial de django-cors-headers: &lt;a href="https://github.com/adamchainz/django-cors-headers" rel="noopener noreferrer"&gt;https://github.com/adamchainz/django-cors-headers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MDN Web Docs sobre CORS: &lt;a href="https://developer.mozilla.org/es/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTTP/CORS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Django REST framework documentation on CORS: &lt;a href="https://www.django-rest-framework.org/topics/ajax-csrf-cors/" rel="noopener noreferrer"&gt;https://www.django-rest-framework.org/topics/ajax-csrf-cors/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>django</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deconstrución de Objectos en JavaScript</title>
      <dc:creator>Isaac Zepeda</dc:creator>
      <pubDate>Sat, 03 Aug 2024 16:06:33 +0000</pubDate>
      <link>https://forem.com/keogh/deconstrucion-de-objectos-en-javascript-3b9b</link>
      <guid>https://forem.com/keogh/deconstrucion-de-objectos-en-javascript-3b9b</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;JavaScript, como lenguaje de programación, ha evolucionado significativamente desde su creación. Con la introducción de ECMAScript 6 (ES6) en 2015, llegaron varias características que mejoraron la legibilidad y eficiencia del código. Una de estas características es la deconstrucción (o destructuring) de objetos. La deconstrucción permite extraer propiedades de objetos y arreglos de manera más concisa y legible. En este artículo, exploraremos en detalle qué es la deconstrucción de objetos, cómo se usa y algunos casos prácticos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es la deconstrucción de objetos?
&lt;/h2&gt;

&lt;p&gt;La deconstrucción de objetos es una sintaxis que permite desempacar valores de arreglos o propiedades de objetos en variables distintas. Esto se hace utilizando una sintaxis similar a la de creación de objetos y arreglos. Veamos un ejemplo básico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mazatlán&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ciudad&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Juan&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 30&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Mazatlán&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, el objeto &lt;code&gt;persona&lt;/code&gt; tiene tres propiedades: &lt;code&gt;nombre&lt;/code&gt;, &lt;code&gt;edad&lt;/code&gt; y &lt;code&gt;ciudad&lt;/code&gt;. Utilizando la sintaxis de deconstrucción, creamos tres variables (&lt;code&gt;nombre&lt;/code&gt;, &lt;code&gt;edad&lt;/code&gt; y &lt;code&gt;ciudad&lt;/code&gt;) y les asignamos los valores correspondientes del objeto &lt;code&gt;persona&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beneficios de la deconstrucción de objetos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Código más limpio y legible&lt;/strong&gt;: La deconstrucción reduce la cantidad de líneas de código necesarias para extraer propiedades de un objeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asignación simultánea&lt;/strong&gt;: Permite asignar múltiples variables en una sola línea, haciendo el código más compacto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valores por defecto&lt;/strong&gt;: La deconstrucción permite asignar valores por defecto a variables si la propiedad no existe en el objeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renombrado de variables&lt;/strong&gt;: Se pueden renombrar las variables al deconstruir, lo que es útil para evitar conflictos de nombres.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Características
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Asignación de valores por defecto
&lt;/h3&gt;

&lt;p&gt;Es posible asignar valores por defecto a las variables si la propiedad que se intenta deconstruir no existe en el objeto. Esto se hace utilizando el operador &lt;code&gt;=&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ciudad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Desconocida&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Desconocida&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, la propiedad &lt;code&gt;ciudad&lt;/code&gt; no existe en el objeto &lt;code&gt;persona&lt;/code&gt;, por lo que la variable &lt;code&gt;ciudad&lt;/code&gt; toma el valor por defecto 'Desconocida'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Renombrado de variables
&lt;/h3&gt;

&lt;p&gt;Es posible renombrar las variables mientras se deconstruye un objeto utilizando la sintaxis &lt;code&gt;propiedad: nuevoNombre&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nombreCompleto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;años&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombreCompleto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Juan&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;años&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// 30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, la propiedad &lt;code&gt;nombre&lt;/code&gt; se deconstruye en la variable &lt;code&gt;nombreCompleto&lt;/code&gt; y &lt;code&gt;edad&lt;/code&gt; en &lt;code&gt;años&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deconstrucción anidada
&lt;/h3&gt;

&lt;p&gt;La deconstrucción también puede ser utilizada en objetos anidados, permitiendo extraer propiedades de objetos dentro de otros objetos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;direccion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mazatlán&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pais&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;México&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;direccion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pais&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Mazatlán&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pais&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// México&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, extraemos &lt;code&gt;ciudad&lt;/code&gt; y &lt;code&gt;pais&lt;/code&gt; del objeto &lt;code&gt;direccion&lt;/code&gt; que está anidado dentro del objeto &lt;code&gt;persona&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deconstrucción con parámetros de función
&lt;/h3&gt;

&lt;p&gt;La deconstrucción de objetos es especialmente útil cuando se trabaja con parámetros de funciones, permitiendo pasar objetos completos y deconstruir sus propiedades directamente en la firma de la función.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mostrarInformacion&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ciudad&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Nombre: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Edad: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Ciudad: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mazatlán&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;mostrarInformacion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, la función &lt;code&gt;mostrarInformacion&lt;/code&gt; recibe un objeto y deconstruye sus propiedades directamente en los parámetros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intercambio de Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deconstrucción en la Importación de Módulos
&lt;/h3&gt;

&lt;p&gt;Otro uso práctico de la deconstrucción es en la importación de módulos. Cuando importamos varios elementos de un módulo, podemos deconstruirlos directamente en la declaración de importación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Uso de useState y useEffect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, deconstruimos &lt;code&gt;useState&lt;/code&gt; y &lt;code&gt;useEffect&lt;/code&gt; directamente desde el módulo 'react'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deconstrucción en Ciclos
&lt;/h3&gt;

&lt;p&gt;La deconstrucción puede ser utilizada en ciclos para iterar sobre arreglos de objetos y extraer sus propiedades de manera concisa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;personas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Luis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;personas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Nombre: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Edad: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, iteramos sobre un arreglo de objetos &lt;code&gt;personas&lt;/code&gt; y deconstruimos &lt;code&gt;nombre&lt;/code&gt; y &lt;code&gt;edad&lt;/code&gt; directamente en el ciclo &lt;code&gt;for...of&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deconstrucción y Rest Operator
&lt;/h3&gt;

&lt;p&gt;La deconstrucción se puede combinar con el operador rest (&lt;code&gt;...&lt;/code&gt;) para capturar el resto de las propiedades de un objeto en una nueva variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mazatlán&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;profesion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ingeniero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;resto&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Juan&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 30&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// { ciudad: 'Mazatlán', profesion: 'Ingeniero' }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, &lt;code&gt;nombre&lt;/code&gt; y &lt;code&gt;edad&lt;/code&gt; se extraen del objeto &lt;code&gt;persona&lt;/code&gt;, y el resto de las propiedades (&lt;code&gt;ciudad&lt;/code&gt; y &lt;code&gt;profesion&lt;/code&gt;) se agrupan en el objeto &lt;code&gt;resto&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deconstrucción de Arrays
&lt;/h3&gt;

&lt;p&gt;Aunque este artículo se centra en objetos, es importante mencionar que la deconstrucción también funciona con arrays:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;primero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;segundo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;resto&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;primero&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;segundo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2 console.log(resto);   // [3, 4, 5]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Casos prácticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manipulación de objetos en APIs
&lt;/h3&gt;

&lt;p&gt;Cuando se trabaja con datos provenientes de APIs, la deconstrucción puede simplificar la manipulación de los datos. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/persona/1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ciudad&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Nombre: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Edad: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Ciudad: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Estado en React
&lt;/h3&gt;

&lt;p&gt;En React, la deconstrucción se usa frecuentemente al trabajar con el estado y las propiedades de los componentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Componente&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ciudad&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Ciudad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persona&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ciudad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mazatlán&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Componente&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;persona&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, se pasa un objeto &lt;code&gt;persona&lt;/code&gt; al componente &lt;code&gt;Componente&lt;/code&gt; y se deconstruyen las propiedades directamente en los parámetros de la función.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validación y Limpieza de Datos
&lt;/h3&gt;

&lt;p&gt;La deconstrucción también es útil para la validación y limpieza de datos al recibir objetos con múltiples propiedades.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;procesarUsuario&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;El nombre es requerido&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email no válido&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// Procesar usuario&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Juan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;juan@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;procesarUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, se deconstruyen las propiedades &lt;code&gt;nombre&lt;/code&gt;, &lt;code&gt;edad&lt;/code&gt; y &lt;code&gt;email&lt;/code&gt; del objeto &lt;code&gt;usuario&lt;/code&gt; para realizar validaciones antes de procesar los datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;La deconstrucción de objetos en JavaScript es una característica poderosa que mejora la legibilidad y eficiencia del código. Permite extraer propiedades de objetos de manera concisa, asignar valores por defecto, renombrar variables y trabajar con objetos anidados y parámetros de funciones. Su uso adecuado puede simplificar considerablemente la manipulación de datos, especialmente en aplicaciones complejas y al trabajar con APIs.&lt;/p&gt;

&lt;p&gt;En resumen, la deconstrucción es una herramienta esencial en el arsenal de cualquier desarrollador de JavaScript moderno, facilitando un código más claro, conciso y mantenible. Si aún no la has incorporado en tus proyectos, es un buen momento para empezar a hacerlo y aprovechar sus beneficios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos adicionales
&lt;/h2&gt;

&lt;p&gt;Para más información, puedes consultar los siguientes recursos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener noreferrer"&gt;MDN Web Docs - Destructuring assignment&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.ecma-international.org/ecma-262/6.0/" rel="noopener noreferrer"&gt;ECMAScript Language Specification&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.freecodecamp.org/news/javascript-destructuring-the-complete-guide/" rel="noopener noreferrer"&gt;JavaScript Destructuring: The Complete Guide - FreeCodeCamp&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/getify/You-Dont-Know-JS" rel="noopener noreferrer"&gt;You Don't Know JS" (YDKJS) de Kyle Simpson&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>es6</category>
    </item>
  </channel>
</rss>
