<?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>DEV Community: Iosvany Alvarez</title>
    <description>The latest articles on DEV Community by Iosvany Alvarez (@lucasgio).</description>
    <link>https://dev.to/lucasgio</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%2F547082%2Febcf388e-bca0-4989-bc96-a29030112fb1.png</url>
      <title>DEV Community: Iosvany Alvarez</title>
      <link>https://dev.to/lucasgio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucasgio"/>
    <language>en</language>
    <item>
      <title>Nodejs Error Middleware</title>
      <dc:creator>Iosvany Alvarez</dc:creator>
      <pubDate>Tue, 24 Sep 2024 09:52:08 +0000</pubDate>
      <link>https://dev.to/lucasgio/nodejs-error-middleware-ipa</link>
      <guid>https://dev.to/lucasgio/nodejs-error-middleware-ipa</guid>
      <description>&lt;p&gt;Handling errors in a Rest API with Nodejs and Express application is crucial for maintaining a smooth and seamless user experience. Integrating TypeScript adds strong typing to the mix, making error handling even more efficient and reliable. Let me shared my experiencie and by using good practice code principales we can have a custom error handling mechanism in Node.js using TypeScript. This approach not only improves code maintainability but also provides clear and descriptive error messages for debugging.&lt;/p&gt;

&lt;p&gt;First but not least, why we have or for me &lt;strong&gt;&lt;em&gt;must&lt;/em&gt;&lt;/strong&gt; implement this approach. Let me shared some thoughts find in the research. &lt;/p&gt;

&lt;p&gt;Error handling in any application is essential for identifying bugs and improving stability. Node.js, a popular backend framework, can become complex when handling errors across multiple layers. By leveraging TypeScript's strong typing, we can manage errors more efficiently and prevent potential bugs early in the development process. Custom error handling offers the following advantages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced readability&lt;/strong&gt;: Custom error classes provide more descriptive error messages.&lt;br&gt;
&lt;strong&gt;Easier debugging&lt;/strong&gt;: A structured error handling system simplifies tracking and fixing issues.&lt;br&gt;
&lt;strong&gt;Unified error structure&lt;/strong&gt;: Ensures that errors have a consistent format throughout your application.&lt;/p&gt;

&lt;p&gt;Let's go to some example to make this clear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgczydali7coywp114ev0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgczydali7coywp114ev0.png" alt="CustomErrorClass" width="" height=""&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The fundamental purpose of this class is to inherit from the Error interface and to be able to customize our errors. Having a SRP (Single Responsibility Principle) principle.&lt;/p&gt;

&lt;p&gt;Now you can extend this class and create for example a error custom class for &lt;strong&gt;NotFoundError&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbwaihxlcf8sjvjdbl4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbwaihxlcf8sjvjdbl4t.png" alt="NotFoundErrorClass" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a middleware to define you custom capture error handling, of course return a better format you response. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdwk9z86hlg7cpljts75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdwk9z86hlg7cpljts75.png" alt="Middleware" width="" height=""&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;and register middleware in root api server class. In my case i capture for all request not found error&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdmc2nfc9mpqobme68ag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdmc2nfc9mpqobme68ag.png" alt="RegisterMiddleware" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Implementing custom error handling in Node.js with TypeScript enhances the robustness and maintainability of your application. By using custom error classes and middleware, you ensure consistent and clear error messages, making debugging and monitoring more efficient.&lt;/p&gt;

</description>
      <category>node</category>
      <category>express</category>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>Cómo el análisis de código estático puede salvarte el día como programador: Un Análisis</title>
      <dc:creator>Iosvany Alvarez</dc:creator>
      <pubDate>Wed, 06 Mar 2024 18:49:03 +0000</pubDate>
      <link>https://dev.to/lucasgio/como-el-analisis-de-codigo-estatico-puede-salvarte-el-dia-como-programador-un-analisis-5hhm</link>
      <guid>https://dev.to/lucasgio/como-el-analisis-de-codigo-estatico-puede-salvarte-el-dia-como-programador-un-analisis-5hhm</guid>
      <description>&lt;p&gt;Introducción: Como programadores e ingeniero de software, sabemos que escribir código de alta calidad es crucial para el éxito de cualquier proyecto de software. Sin embargo, llevar un registro de cada línea de código y garantizar su corrección puede ser una tarea desalentadora. ¡Aquí es donde entran en juego los analizadores de código estático! En este tutorial, exploraremos la importancia de utilizar analizadores de código estático y cómo pueden beneficiarnos como tales.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;¿Pero que son los analizadores de código? Los analizadores de código estático son herramientas poderosas que examinan nuestro código sin ejecutarlo realmente. Escanean nuestra base de código, buscando posibles errores, vulnerabilidades y otros problemas de calidad de código. Piensa en ellos como los detectives personales de tu código, buscando incansablemente cualquier problema oculto que pueda causar dolores de cabeza más adelante.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detectando errores tempranamente: Uno de los principales beneficios de utilizar analizadores estáticos de código es su capacidad para detectar errores tempranamente en el proceso de desarrollo. Al analizar el código estáticamente, estas herramientas pueden identificar errores comunes de programación, como excepciones de puntero nulo, fugas de memoria o asignaciones incorrectas de variables. Al detectar estos problemas desde el principio, podemos ahorrarnos el dolor de cabeza de depurar problemas complejos más adelante.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagínate que estás construyendo un puente. Es mucho mejor identificar cualquier debilidad estructural durante la fase de planificación en lugar de cuando el puente ya está construido y las personas lo están cruzando. De manera similar, los analizadores de código estático nos ayudan a identificar posibles problemas antes de que se conviertan en problemas importantes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Garantizando la calidad del código: Es fundamental escribir un código limpio y fácil de mantener en cualquier proyecto de software. Los analizadores de código estático nos brindan información valiosa sobre la calidad de nuestro código. Pueden detectar problemas comunes en el código, como código duplicado, complejidad excesiva o convenciones de nomenclatura deficientes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Al identificar estos problemas, podemos mejorar la calidad general de nuestra base de código. Esto no solo facilita que otros programadores comprendan y mantengan nuestro código, sino que también reduce las posibilidades de introducir nuevos errores o cometer errores costosos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cumplimiento y Seguridad: En el mundo actual, la seguridad es una prioridad absoluta. Los analizadores de código estático pueden ayudarnos a identificar posibles vulnerabilidades de seguridad en nuestro código. Pueden detectar problemas de seguridad comunes, como la inyección SQL, scripting entre sitios o desbordamientos de búfer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Además, el uso de analizadores de código estático también puede ayudarnos a asegurar el cumplimiento de los estándares de codificación y las mejores prácticas. Estos pueden hacer cumplir las pautas de codificación, como el estilo de sangría, las convenciones de nomenclatura de variables o el uso adecuado de bibliotecas. Esto no solo mejora la legibilidad de nuestro código, sino que también facilita la colaboración con otros compañeros del equipo.&lt;/p&gt;

&lt;p&gt;Conclusión: En conclusión, los analizadores de código estático son herramientas invaluables para todos. Nos ayudan a detectar errores temprano, garantizar la calidad del código y mejorar la seguridad. Al incorporar el análisis de código estático en nuestro flujo de trabajo de desarrollo, podemos ahorrar tiempo, reducir los costos de mantenimiento y entregar software de mayor calidad. Igualmente es importante añadir que tener una estrategia y planificación del desarrollo, tales como patrones de diseños, buenas practicas y una colaboración en equipo puede hacer que este proceso de análisis del código de un proyecto sea mas viable y mantenible. &lt;/p&gt;

&lt;p&gt;¡Así que vamos a adoptar los analizadores de código estático y hacer que nuestro código sea lo mejor posible! &lt;/p&gt;

</description>
      <category>sonarqube</category>
      <category>bug</category>
    </item>
    <item>
      <title>Mejora tus validaciones en Laravel con Form Request</title>
      <dc:creator>Iosvany Alvarez</dc:creator>
      <pubDate>Mon, 21 Mar 2022 13:25:13 +0000</pubDate>
      <link>https://dev.to/lucasgio/mejora-tus-validaciones-en-laravel-con-form-request-23pd</link>
      <guid>https://dev.to/lucasgio/mejora-tus-validaciones-en-laravel-con-form-request-23pd</guid>
      <description>&lt;p&gt;Laravel ofrece un buen recurso para poder organizarlas de una manera más limpia y funcional.  &lt;/p&gt;

&lt;p&gt;Seguro has visto como desarrollador que solemos codear nuestras validaciones en el controlador. Pero nuestro código crece exponencialmente y sería difícil mantenerlo, de acuerdo a los principios SOLID no debería ser así, los Form Request llegan al rescate. Extraen toda esa lógica en una clase aparte y te brinda diferentes métodos que termina en un código más mantenible y prolijo.  &lt;/p&gt;

&lt;p&gt;Quédate, te mostraré un truco para validar todos los verbos HTTP en un solo archivo.&lt;/p&gt;

&lt;p&gt;Empecemos creando en nuestra terminal nuestro primer Form Request &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focbdkcx8w4ku9mckf1zo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focbdkcx8w4ku9mckf1zo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez creado nos desplazamos a la carpeta en app/http/request en nuestro proyecto y lo abrimos.&lt;/p&gt;

&lt;p&gt;Veamos el primer método&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wuoctknqkjb8kxs2ij4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wuoctknqkjb8kxs2ij4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Devuelve un valor booleano que por default viene en false y define la autorización si la petición del usuario debe llevar a cabo las validaciones establecidas en el Request. También puedes crear una lógica más avanzada para la autorización de ciertos procesos como la actualización, eliminación o adición de recursos. &lt;/p&gt;

&lt;p&gt;Método &lt;strong&gt;rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsf3b9yrp38nhyyvuajsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsf3b9yrp38nhyyvuajsy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Establecerá las reglas para nuestras propiedades que vienen en la petición HTTP. Aquí es cuando le muestro un truco, cuando generamos un Form Request deberíamos generarlo por cada acción o método http, o sea FormRequestPostSale, FormRequestPutSale, etc.&lt;/p&gt;

&lt;p&gt;Sin embargo, con tan solamente encapsularlos dentro de los métodos &lt;strong&gt;match&lt;/strong&gt; y &lt;strong&gt;method&lt;/strong&gt; evaluaremos qué tipo de petición hace el usuario y cuáles son las reglas a evaluar.  &lt;/p&gt;

&lt;p&gt;Nota:&lt;br&gt;
Esta función de match está presente si nada más tienes PHP 8.0 instalado en tu máquina.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qvmu0emgr7qtuk4q86q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qvmu0emgr7qtuk4q86q.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Método &lt;strong&gt;attributes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En este particular y de manera resumida pondrás los nombre con lo que se mostrarán los mensajes de las validaciones. Algo muy identificativo para mayor compresión, entenderás más adelantes como lo utilizaremos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fjzwgiy2t94m6cn4lt8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fjzwgiy2t94m6cn4lt8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Método &lt;strong&gt;message&lt;/strong&gt;&lt;br&gt;
Pieza importante de los Form Request, porque define los mensajes que irían a mostrar. Cómo vemos en la imagen establecemos las reglas con los diferentes mensajes de validación  y como anticipé utilizamos nuestro &lt;strong&gt;:attribute&lt;/strong&gt; para no repetir código. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Opcional&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Método &lt;strong&gt;prepareForValidation&lt;/strong&gt; este método lo empleo para modificar algún parámetro del Request entrante, lo uso para hashear un password y así pasaría al controlador ya convertido y menos código en él. Pero puede hacer infinidades de modificaciones.&lt;/p&gt;

&lt;p&gt;Los Form Request te pueden ayudar a establecer una validación fuerte y eliminar esas líneas de código del controlador. Mantener esa capa que verifica si la petición cumple con todo los parámetros ayudan que la data pase al controlador con los estándares correspondientes. Si algunas de las validaciones faltan, devolverá los errores con código 422 Unprocessed Entry.&lt;/p&gt;

&lt;p&gt;Queda mucho por explicar este es un pequeño resumen de este gran ayuda de Laravel, si deseas profundizar más te dejo la referencia a la documentación. &lt;/p&gt;

&lt;p&gt;Referencias&lt;br&gt;
&lt;a href="https://laravel.com/docs/9.x/validation#preparing-input-for-validation" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si te gusto el post no olvide dar like.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>validations</category>
    </item>
    <item>
      <title>Solución para restringir el acceso por web en una API en Laravel.</title>
      <dc:creator>Iosvany Alvarez</dc:creator>
      <pubDate>Thu, 09 Sep 2021 03:12:07 +0000</pubDate>
      <link>https://dev.to/lucasgio/solucion-para-restringir-el-acceso-por-web-en-una-api-en-laravel-34fo</link>
      <guid>https://dev.to/lucasgio/solucion-para-restringir-el-acceso-por-web-en-una-api-en-laravel-34fo</guid>
      <description>&lt;p&gt;Cuando creamos una API en Laravel queremos que nuestra aplicación solo sea accedida mediante peticiones HTTP con formato JSON.&lt;/p&gt;

&lt;p&gt;Una de las tantas vias que existe es el manejo de excepciones mediante el fichero Handler de nuestro proyecto de Laravel.Tiene un método &lt;strong&gt;register()&lt;/strong&gt;, donde cambiaremos par de lineas de como viene por default cuando se crea la aplicación laravel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahm6c0mw1t6ws1vy54c8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahm6c0mw1t6ws1vy54c8.png" alt="Imagen de un codigo" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pero esta vía no creo que sea la más completa para tratar todos los posibles errores o excepciones, pero funciona.&lt;/p&gt;

&lt;p&gt;Ahora le quiero mostrar otra opción y es mediante la creación de un middleware que nos va a evualar las peticiones HTTP,pero lo configuraremos de manera global para que todas las peticiones que se realicen hacia nuestra API cumplan con los requisistos establecidos.&lt;/p&gt;

&lt;p&gt;En la imagen de abajo se observa el código del middleware y la configuración que he usado para hacerlo de manera global.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class JsonMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (!$request-&amp;gt;wantsJson()) 
        {
            return response()-&amp;gt;json([
                'success'=&amp;gt; 'false',
                'message' =&amp;gt; 'Do not have authorization'
            ], 404);   
        }

        return $next($request);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u5smyfgnrcbbef9zfbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u5smyfgnrcbbef9zfbq.png" alt="Imagen de un codigo" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui vamos analizar que las peticiones que se hagan, sino vienen en formato JSON devolveran una respuesta. Para eso nos apoyamos en el metodo &lt;strong&gt;wantsJson&lt;/strong&gt; que devuelve un valor booleano si el request no viene en formato requerido.&lt;/p&gt;

&lt;p&gt;Aquí las imagenes de los resultados tanto de un navegador como del cliente HTTP Postman, de las peticiones hechas después de haber configurado nuestro middleware de manera global. Las mismas no cumplen con los requisitos y nuestra API retorna una respuesta con el error.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyssnr7fh4pro7p3p712.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyssnr7fh4pro7p3p712.png" alt="Imagen de un codigo" width="800" height="392"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60cw0xipe61oc747w3ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60cw0xipe61oc747w3ui.png" alt="Imagen de un codigo" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>api</category>
      <category>php</category>
    </item>
    <item>
      <title>Como integrar Tailwindcss a un proyecto de React.</title>
      <dc:creator>Iosvany Alvarez</dc:creator>
      <pubDate>Thu, 29 Apr 2021 23:09:54 +0000</pubDate>
      <link>https://dev.to/lucasgio/como-integrar-tailwindcss-a-un-proyecto-de-react-112d</link>
      <guid>https://dev.to/lucasgio/como-integrar-tailwindcss-a-un-proyecto-de-react-112d</guid>
      <description>&lt;p&gt;En mis proyecto de React siempre trabajo con el framework de css Bootstrap, le da un diseño único a las aplicaciones. Ultimamente esta muy de moda Tailwindcss un framework css muy potente y con un build muy ligero pero;como lo integro a mi app de react?&lt;/p&gt;

&lt;p&gt;Bueno para eso debemos asumir que ya tenemos nuestra aplicación de react, sino sigue este link &lt;a href="https://reactjs.org/docs/create-a-new-react-app.html" rel="noopener noreferrer"&gt;Create a New React App&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien, hecho el anterior paso vamos a integrar tailwindcss a nuestro proyecto&lt;/p&gt;

&lt;h6&gt;
  
  
  1. Instalación de tailwindcss
&lt;/h6&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm install tailwindcss postcss-cli autoprefixer -D
npx tailwindcss init



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este paso nos instalará en nuestro proyecto las depedencias de tailwindcss, postcss-cli y autoprefixer. Debemos verificar que dichas dependencias existan en el archivo package.json de nuestro proyecto.  &lt;/p&gt;

&lt;h6&gt;
  
  
  2.Configuracion de postcss.config.js
&lt;/h6&gt;

&lt;p&gt;En la raíz de nuestro proyecto crearemos un archivo con el nombre de &lt;strong&gt;postcss.config.js&lt;/strong&gt; y dentro copiaremos este código.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

module.exports = {
  plugins: [
    // ...
    require('tailwindcss'),
    require('autoprefixer'),
    // ...
  ]
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este archivo le dira a react que requiere de las dependencia de tailwind y autoprefixer y luego exportarlas.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6ff1334zq1wkz4anhyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6ff1334zq1wkz4anhyl.png" alt="Project React"&gt;&lt;/a&gt; &lt;br&gt;
Si quieres profundizar respecto a este tema te dejo este link:&lt;br&gt;
&lt;a href="https://tailwindcss.com/docs/configuration" rel="noopener noreferrer"&gt;Configuracion de postcss.config.js&lt;/a&gt;.&lt;/p&gt;

&lt;h6&gt;
  
  
  3. Crear tailwind.css
&lt;/h6&gt;

&lt;p&gt;Ahora crearemos un archivo tailwind.css que sera nuestro .css como tradicionalmente conocemos.Es aconsejable crearlo en esta ruta &lt;strong&gt;src/assets/tailwind.css&lt;/strong&gt; y dentro debemos copiar el siguiente código.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

@tailwind base;
@tailwind components;
@tailwind utilities;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;No te asuste si te marca un warning es normal.Dentro de este archivo escribiremos nuestra propia configuración de estilos de componentes,botones,color de fuente, entre otras opciones.En estos links se profundiza más sobre el tema:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tailwindcss.com/docs/adding-base-styles" rel="noopener noreferrer"&gt;Adding-base style&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tailwindcss.com/docs/extracting-components" rel="noopener noreferrer"&gt;Extracting Component&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tailwindcss.com/docs/adding-new-utilities" rel="noopener noreferrer"&gt;Adding New Utilities&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PD:En este mismo directorio creamos un archivo llamado &lt;strong&gt;main.css&lt;/strong&gt;, lo dejamos vacío,aquí se almacenará la transpilación del código css de tailwindcss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfu8v1nr3g9w21428pbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfu8v1nr3g9w21428pbg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  4. Configuración del package.json
&lt;/h6&gt;

&lt;p&gt;Configuramos los comandos del package.json para poder ejecutar el &lt;strong&gt;npm start o npm run build&lt;/strong&gt; a producción.La configuración es un poco diferente, ya que tenemos que compilar nuestro código de react conjunto con el de tailwindcss, para eso en el espacio de los script copiamos estos codigos:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

"scripts": {
    "start": "npm run watch:css &amp;amp;&amp;amp; react-scripts start",
    "build": "npm run build:css &amp;amp;&amp;amp; react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "build:css": "postcss src/assets/tailwind.css -o src/assets/main.css",
    "watch:css": "postcss src/assets/tailwind.css -o src/assets/main.css"
  },


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h6&gt;
  
  
  5.Importación del main.css.
&lt;/h6&gt;

&lt;p&gt;Ya por último en index.js de nuestro proyecto importaremos el archivo main.css que creamos en el paso 3.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react';
import ReactDOM from 'react-dom';
import './assets/main.css';
import App from './App.jsx';

ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById('root')
);


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;También como extra en nuestro componente App.js podemos escribir algun código de algún componente de tailwindcss. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wueqik7krts0cizy7z6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wueqik7krts0cizy7z6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Te dejo un link con códigos de componentes de tailwindcss:&lt;br&gt;
&lt;a href="https://tailwindcss.com/docs/container" rel="noopener noreferrer"&gt;Container docs&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Una vez hecho las configuraciones ya podemos ejecutar el comando en nuestra terminal &lt;strong&gt;npm start&lt;/strong&gt; y deberá levantar un servidor local con nuestra aplicación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnhql5q2tmgsqu43mbjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnhql5q2tmgsqu43mbjf.png" alt="Alt Text"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Con estos 5 pasos puedes tener integrado Tailwindcss a nuestra aplicación de React y asi poder construir poderosos componentes y con diseño brillantes.&lt;/p&gt;

&lt;p&gt;Saludos Codificados&lt;br&gt;
Iosvany Alvarez&lt;br&gt;
Full Stack Developer&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
