<?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: Vladimir Agaev</title>
    <description>The latest articles on DEV Community by Vladimir Agaev (@vladwulf).</description>
    <link>https://dev.to/vladwulf</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%2F725621%2F05cf1199-479d-490b-a848-1119cbbdbf5d.jpg</url>
      <title>DEV Community: Vladimir Agaev</title>
      <link>https://dev.to/vladwulf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vladwulf"/>
    <language>en</language>
    <item>
      <title>NestJs RBAC tutorial</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Thu, 02 Mar 2023 11:57:08 +0000</pubDate>
      <link>https://dev.to/vladwulf/nestjs-rbac-tutorial-33gf</link>
      <guid>https://dev.to/vladwulf/nestjs-rbac-tutorial-33gf</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Um9wyVaB5Iw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>express</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Session Authentication vs Basic Authentication vs JWT Authentication: Which is Right for Your Project?</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Tue, 21 Feb 2023 10:07:59 +0000</pubDate>
      <link>https://dev.to/vladwulf/session-authentication-vs-basic-authentication-vs-jwt-authentication-which-is-right-for-your-project-240l</link>
      <guid>https://dev.to/vladwulf/session-authentication-vs-basic-authentication-vs-jwt-authentication-which-is-right-for-your-project-240l</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8haNjnq26K4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>security</category>
    </item>
    <item>
      <title>How to implement a 404 redirect in react router v6</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Wed, 24 Aug 2022 10:38:10 +0000</pubDate>
      <link>https://dev.to/vladwulf/how-to-implement-a-404-redirect-in-react-router-v6-27kf</link>
      <guid>https://dev.to/vladwulf/how-to-implement-a-404-redirect-in-react-router-v6-27kf</guid>
      <description>&lt;p&gt;Page redirection in the new React router v6 can be tricky.&lt;/p&gt;

&lt;p&gt;Let's say you have the following routes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"home"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"profile"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Profile&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, that means that if we navigate to &lt;code&gt;/home&lt;/code&gt; or &lt;code&gt;/todo&lt;/code&gt;, none of the routes will be rendered.&lt;/p&gt;

&lt;p&gt;This is a classic use case example for a 404 page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a 404 page
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"home"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"profile"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Profile&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Page404&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example react router will fallback to the 404 page if the user attemps to enter an invalid url.&lt;/p&gt;

&lt;p&gt;The "*" will catch all the paths that have not been caught by previous routes. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 404 page should thus be the last route to be rendered.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a page redirect
&lt;/h2&gt;

&lt;p&gt;We can improve the code further by adding a redirect for the default home directory. &lt;/p&gt;

&lt;p&gt;This way the user can access the home page by either navigating to &lt;strong&gt;/home&lt;/strong&gt; or to &lt;strong&gt;/&lt;/strong&gt; (which would redirect him to home).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"home"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"profile"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Profile&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;index&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Navigate&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Page404&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you liked this tutorial consider visiting my website &lt;a href="https://www.codewithvlad.com/"&gt;Code with Vlad&lt;/a&gt; where I provide high quality programming courses.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Zustand React Typescript Tutorial (vs Easy Peasy)</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Tue, 11 Jan 2022 11:47:44 +0000</pubDate>
      <link>https://dev.to/vladwulf/zustand-react-typescript-tutorial-vs-easy-peasy-3f5i</link>
      <guid>https://dev.to/vladwulf/zustand-react-typescript-tutorial-vs-easy-peasy-3f5i</guid>
      <description>&lt;p&gt;Hey guys,&lt;br&gt;
I've been using easy peasy for years now as an alternative to REDUX and I love it!&lt;/p&gt;

&lt;p&gt;I'd like to make a comparison of this library with zustand (another state management library based on hooks) that I have used recently and that is more popular.&lt;/p&gt;

&lt;p&gt;I personally prefer easy peasy, in this video I explain why!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/dOJkaYE249I"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>redux</category>
    </item>
    <item>
      <title>Complete NestJs JWT Authentication Example with Integration and End-to-End tests!</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Thu, 06 Jan 2022 17:04:00 +0000</pubDate>
      <link>https://dev.to/vladwulf/complete-nestjs-jwt-authentication-example-with-integration-and-end-to-end-tests-326d</link>
      <guid>https://dev.to/vladwulf/complete-nestjs-jwt-authentication-example-with-integration-and-end-to-end-tests-326d</guid>
      <description>&lt;p&gt;Hi there!&lt;/p&gt;

&lt;p&gt;I've previously created a detailed video about jwt authentication in nestjs &lt;a href="https://youtu.be/uAKzFhE3rxU"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I initially was not expecting much but apparently the subject of jwt authentication is very popular. Especially when it comes to &lt;strong&gt;access tokens&lt;/strong&gt; and &lt;strong&gt;refresh tokens&lt;/strong&gt;. I've received a lot of comments and even a PR to my example github repository. ‎😃&lt;/p&gt;

&lt;p&gt;I've decided to give back and spent a whole afternoon adding features to the repository showcasing how to use access tokens and refresh tokens in NestJs with &lt;strong&gt;INTEGRATION TESTS&lt;/strong&gt; and &lt;strong&gt;END TO END&lt;/strong&gt; tests! YAY! ‎😃 ‎😃 ‎😃&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ip9itmeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sonaodwavfq66ag93utp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ip9itmeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sonaodwavfq66ag93utp.png" alt="E2E Tests" width="880" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--428Z6HaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36iqvgygitwjo4pke35a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--428Z6HaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36iqvgygitwjo4pke35a.png" alt="Integration Tests" width="880" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository is here: &lt;a href="https://github.com/vladwulf/nestjs-jwts"&gt;https://github.com/vladwulf/nestjs-jwts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I think it will be a solid base for anyone who wants to learn to implement authentication with jwt as there are not a lot of resources on the subject.&lt;/p&gt;

&lt;p&gt;The project uses Prisma, argon, a test database for integration and e2e tests with the necessary scripts.&lt;/p&gt;

&lt;p&gt;I hope that you will find it useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any feedback is welcome :)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do no hesitate to visit &lt;a href="https://www.codewithvlad.com/"&gt;Code With Vlad&lt;/a&gt; for more NestJs content&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>EXPRESS JS CRASH COURSE</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Sat, 25 Dec 2021 01:09:31 +0000</pubDate>
      <link>https://dev.to/vladwulf/express-js-crash-course-dd9</link>
      <guid>https://dev.to/vladwulf/express-js-crash-course-dd9</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yB79hoL7svQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>ES6 MODULES EXPLAINED</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Sat, 25 Dec 2021 01:04:00 +0000</pubDate>
      <link>https://dev.to/vladwulf/es-modules-explained-208e</link>
      <guid>https://dev.to/vladwulf/es-modules-explained-208e</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/42Qggf402Mo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Do no hesitate to visit &lt;a href="https://www.codewithvlad.com/"&gt;Code With Vlad&lt;/a&gt; for more javascript content&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>NestJs Testing Tutorial - Integration Testing</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Tue, 07 Dec 2021 11:35:00 +0000</pubDate>
      <link>https://dev.to/vladwulf/nestjs-testing-tutorial-integration-testing-4ah5</link>
      <guid>https://dev.to/vladwulf/nestjs-testing-tutorial-integration-testing-4ah5</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/J5As5D_Ht_w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Do no hesitate to visit &lt;a href="https://www.codewithvlad.com/"&gt;Code With Vlad&lt;/a&gt; for more NestJs content&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>NestJs JWT - Access Tokens &amp; Refresh Tokens - Ultimate Guide</title>
      <dc:creator>Vladimir Agaev</dc:creator>
      <pubDate>Sun, 05 Dec 2021 14:19:00 +0000</pubDate>
      <link>https://dev.to/vladwulf/nestjs-jwt-access-tokens-refresh-tokens-ultimate-guide-1pp5</link>
      <guid>https://dev.to/vladwulf/nestjs-jwt-access-tokens-refresh-tokens-ultimate-guide-1pp5</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/uAKzFhE3rxU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Do no hesitate to visit &lt;a href="https://www.codewithvlad.com/"&gt;Code With Vlad&lt;/a&gt; for more NestJs content&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
