<?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: Olufemi obafunmiso</title>
    <description>The latest articles on Forem by Olufemi obafunmiso (@olufemi).</description>
    <link>https://forem.com/olufemi</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%2F204475%2F78b009be-fd3e-4978-be09-d4ba87bf1f0c.jpeg</url>
      <title>Forem: Olufemi obafunmiso</title>
      <link>https://forem.com/olufemi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/olufemi"/>
    <language>en</language>
    <item>
      <title>How to use Console.time() and Console.timeEnd() to make informed decisions.</title>
      <dc:creator>Olufemi obafunmiso</dc:creator>
      <pubDate>Mon, 06 Sep 2021 10:14:46 +0000</pubDate>
      <link>https://forem.com/olufemi/how-to-use-console-time-and-console-timeend-to-make-informed-decisions-324e</link>
      <guid>https://forem.com/olufemi/how-to-use-console-time-and-console-timeend-to-make-informed-decisions-324e</guid>
      <description>&lt;p&gt;As an engineer, especially when working on enterprise-grade applications, your coding is influenced by many factors. It is no longer about what function worked or your ability to achieve your desired result. It is rather about writing a performant code, thinking about time complexity vs space complexity, scaling, and ensuring that your application is as fast as possible.&lt;/p&gt;

&lt;p&gt;In this tutorial, I'll be showing you how to make an informed decision using Javascript console Object methods   &lt;code&gt;console.time()&lt;/code&gt; and &lt;code&gt;console.timeEnd()&lt;/code&gt;. Yeah, I know you're used to &lt;code&gt;console.log()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To understand this, I'll be using a stopwatch to illustrate. Let's assume you wanted to start a race, you would start your stopwatch and when the race ends, you would stop your stopwatch. See &lt;code&gt;console.time()&lt;/code&gt; as starting your stopwatch and &lt;code&gt;console.timeEnd()&lt;/code&gt; as stopping your stopwatch. Easy right? &lt;/p&gt;

&lt;p&gt;I want to merge two Objects with time complexity in mind. Remember, it is not about what works but what works in the shortest time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXAMPLE 1:&lt;/strong&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;object_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;id&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="na"&gt;age&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="na"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;male&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&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="nx"&gt;object_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Honda&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;colour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;black&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2021&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="c1"&gt;//Start the timer&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object_assign&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="nx"&gt;merge_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object_1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;object_2&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="nx"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object_assign&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//end the timer&lt;/span&gt;

    &lt;span class="c1"&gt;//Start the timer&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rest_operator&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="nx"&gt;merge_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;object_1&lt;/span&gt;&lt;span class="p"&gt;,...&lt;/span&gt;&lt;span class="nx"&gt;object_1&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="nx"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rest_operator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//end the timer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, I merged two objects using  Object constructor method &lt;code&gt;Object.assign()&lt;/code&gt; and Javascript &lt;code&gt;spread operator.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB:&lt;/strong&gt; &lt;code&gt;console.time()&lt;/code&gt; takes the parameter "label" and the label must be the same name when calling &lt;code&gt;console.timeEnd()&lt;/code&gt; to stop the timer and get the time output to the console. If the label name is not the same, it will throw &lt;code&gt;Warning: No such label '{label name}' for console.timeEnd()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time output on the console:&lt;/strong&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="nx"&gt;object_assign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.257&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;
    &lt;span class="nx"&gt;rest_operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.032&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the console output, rest/spread operator is faster than &lt;code&gt;Object.assign()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Again, this tutorial is focused on how to use &lt;code&gt;console.time()&lt;/code&gt; and &lt;code&gt;console.timeEnd()&lt;/code&gt; to make an informed decision and not why rest operators should be used over &lt;code&gt;Object.assign()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXAMPLE 2:&lt;/strong&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;arr&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;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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;//Start timer&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;map&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&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="nx"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;map&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//End timer&lt;/span&gt;

    &lt;span class="c1"&gt;//Start timer&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;forEach&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;element&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="nx"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forEach&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;//End timer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;RESPONSE:&lt;/strong&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="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.188&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;
    &lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.035&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;console.time()&lt;/code&gt; and &lt;code&gt;console.timeEnd()&lt;/code&gt; can also be used as a quick debugging tool to identify bottlenecks in our application.&lt;/p&gt;

&lt;p&gt;Check MDN documentation for &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/console/time"&gt;console.time()&lt;/a&gt; and  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/console/timeEnd"&gt;console.timeEnd()&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Do you like this article? Hit me up on  &lt;a href="https://twitter.com/femioba_"&gt;twitter&lt;/a&gt;  or  &lt;a href="https://www.linkedin.com/in/olufemi-obafunmiso/"&gt;linkedin&lt;/a&gt; &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>codequality</category>
      <category>performance</category>
    </item>
    <item>
      <title>Validation; joi brings you "Joy" 😁</title>
      <dc:creator>Olufemi obafunmiso</dc:creator>
      <pubDate>Fri, 23 Jul 2021 14:36:54 +0000</pubDate>
      <link>https://forem.com/olufemi/validation-joi-brings-you-joy-fof</link>
      <guid>https://forem.com/olufemi/validation-joi-brings-you-joy-fof</guid>
      <description>&lt;p&gt;Ever tried to do some sort of schema validation while building API(s) and you have to write a lot of &lt;code&gt;If else&lt;/code&gt; conditions/statements to ensure you throw error when the user inputs  wrong data? Yeah, it's stressful and trust me, you still won't cater for all scenarios. &lt;br&gt;
The good news is  joi has come to your rescue and it's here to bring you joy [pun intended].&lt;br&gt;
In this tutorial, I will be showing you how to validate with &lt;code&gt;joi&lt;/code&gt;. &lt;br&gt;
&lt;code&gt;joi&lt;/code&gt; helps define data easily without the need to worry about not throwing error; joi does the job for you by throwing error.&lt;/p&gt;

&lt;p&gt;[For this tutorial, I assumed you already know how to setup a server with &lt;code&gt;express.js&lt;/code&gt;]&lt;/p&gt;

&lt;p&gt;Install all dependencies required for this task &lt;code&gt;npm install joi express&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial we'll be validating the following details;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;username&lt;/li&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;li&gt;firstname&lt;/li&gt;
&lt;li&gt;lastname&lt;/li&gt;
&lt;li&gt;email&lt;/li&gt;
&lt;li&gt;phonenumber&lt;/li&gt;
&lt;li&gt;date of birth [DOB]&lt;/li&gt;
&lt;li&gt;Sex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get right into it 💻💻💻&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;Joi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;joi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/register&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Define Schema&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;alphanum&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;a-zA-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{3,30}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;confirm_password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;any.only&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password does not match&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;firstname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;lastname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&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="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;minDomainSegments&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="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;phonenumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;([&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;])?(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;dob&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;01-01-2003&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iso&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;date.format&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Date format is YYYY-MM-DD`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;date.max&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;`Age must be 18+`&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;sex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;male&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;female&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;others&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;// Validate req.body against the defined schema&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&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;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;validation&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="nx"&gt;error&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;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid request data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Registration successful&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;
      &lt;span class="p"&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&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;&lt;code&gt;Joi.object()&lt;/code&gt; instantiate a Joi schema object to work with. The schema require &lt;code&gt;Joi.object()&lt;/code&gt; to process validation and other Joi features.&lt;br&gt;
I will be explaining the schema constraints and if I have explained some constraints already I won't need to repeat e.g if I have explained &lt;code&gt;.string()&lt;/code&gt; I won't be repeating it again in order to keep the article short and simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;username&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.string()&lt;/code&gt; a string.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; &lt;code&gt;"s"&lt;/code&gt; is in lowercase, not uppercase i.e if you use &lt;code&gt;.String()&lt;/code&gt; joi will throw this error &lt;code&gt;Joi.String is not a function&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;min(6)&lt;/code&gt; - at least 6 characters long&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.max(30)&lt;/code&gt; - not more than 30 characters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.alphanum()&lt;/code&gt; - contain alphanumeric characters e.g (olufemi78)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.uppercase()&lt;/code&gt; - This means when the user input  username, joi should convert  to uppercase (interesting yeah? 😉)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;required()&lt;/code&gt; - This means username is required, if user does not pass it, joi will throw error &lt;code&gt;"\"username\" is required"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;password&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.regex('^[a-zA-Z0-9]{3,30}$')&lt;/code&gt; - This means, it must satisfy the custom regex pattern.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Here's the explanation of the regex pattern&lt;/strong&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="o"&gt;^&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Asserts&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;zA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Z0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&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;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Matches&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt; &lt;span class="nx"&gt;character&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="nx"&gt;but&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="nx"&gt;must&lt;/span&gt; &lt;span class="nx"&gt;between&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;

    &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;End&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use  &lt;a href="http://regex101.com/#pcre" rel="noopener noreferrer"&gt;regex101&lt;/a&gt;  to play with regex. The right pane explains it token by token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;confirm_password&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.equal(Joi.ref('password'))&lt;/code&gt; - This means it reference &lt;code&gt;password&lt;/code&gt; and it must be equal to password.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages({ 'any.only': 'password does not match' })&lt;/code&gt; - If &lt;code&gt;password&lt;/code&gt; and &lt;code&gt;confirm_password&lt;/code&gt; does not match, joi will throw this custom error &lt;code&gt;password does not match&lt;/code&gt; . &lt;code&gt;any.only&lt;/code&gt; is error type so whenever the error type is &lt;code&gt;any.only&lt;/code&gt; I prefer to send custom message and not the typical joi error message. Just make's the error message more descriptive to the user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;firstname&lt;/code&gt; and &lt;code&gt;lastname&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;username&lt;/code&gt; name is required while &lt;code&gt;lastname&lt;/code&gt; is not required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;email&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.email({minDomainSegments: 2})&lt;/code&gt; - It must be a valid email string and must have two domain parts e.g. &lt;code&gt;user.com&lt;/code&gt; . One fascinating thing about email validation with joi is that you can decide the top-level domains (TLDs) you want. e.g; you want only &lt;code&gt;.com&lt;/code&gt; and &lt;code&gt;.net&lt;/code&gt; &lt;code&gt;.email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })&lt;/code&gt; This will only allow &lt;code&gt;.com&lt;/code&gt; and &lt;code&gt;.net&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;phonenumber&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It must be a string with digits in the format based on the regex pattern e.g &lt;code&gt;+248888888888&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;dob&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Joi.date().max('01-01-2003').iso()&lt;/code&gt; - it must be a valid date in ISO 8601 format and it cannot be after Jan 1, 2003. This is super useful if you want to ensure a certain age range can not register on your platform e.g a betting website allow only 18+.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages({'date.format':&lt;/code&gt; &lt;code&gt;Date format is YYYY-MM-DD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'date.max':Age must be 18+})&lt;/code&gt;- This means if user enter invalid date format and joi throws error, rather sending back the not too fancy joi error message, send a custom message.
Custom messages breakdown:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'date.format'&lt;/code&gt;: means the error type i.e if joi is throwing error type that is &lt;code&gt;'date.format'&lt;/code&gt;, then send this custom message &lt;code&gt;Date format is YYYY-MM-DD&lt;/code&gt; to the user. if error type is '&lt;code&gt;date.max':&lt;/code&gt; then send this custom message &lt;code&gt;Age must be 18+&lt;/code&gt; . If there's no custom message for this particular error type (&lt;code&gt;date.max&lt;/code&gt;), joi will throw this &lt;code&gt;'"dob" must be less than or equal to "2003-01-01T00:00:00.000Z"'&lt;/code&gt;. To aid user experience, I decided to make it easy by sending &lt;code&gt;"Age must be 18+"&lt;/code&gt; rather than joi error message. You can literally send any message you pleased. Since it's a custom message, you're fully in control of the message. That's really cool 👌&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The constraints for &lt;code&gt;sex&lt;/code&gt; include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.valid('male', 'female','transger')&lt;/code&gt; - This means only 4 options are accepted i.e &lt;code&gt;male&lt;/code&gt;, &lt;code&gt;female&lt;/code&gt;, &lt;code&gt;transgender&lt;/code&gt; and &lt;code&gt;others&lt;/code&gt;.  If user enter any other option aside from the 4, joi will throw this error &lt;code&gt;"\"sex\" must be one of [male, female, transger, others]"&lt;/code&gt;. This come in handy for analytics. You can easily know the genders that register on your platform.
const validation = schema.validate(req.body);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This line of code takes in the &lt;code&gt;data&lt;/code&gt; from the body request and validates it against the &lt;code&gt;schema&lt;/code&gt; already defined.&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;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;validation&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="nx"&gt;error&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;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

          &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;422&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid request data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I did here is to destructure the joi response object after validation and use &lt;code&gt;map()&lt;/code&gt; to pick out just the error message and not the whole error object.&lt;/p&gt;

&lt;p&gt;Everything is set now. Lets enjoy the thrills and superpower of joi 🔥🔥🔥&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610300851439_Screenshot%2B2021-01-10%2Bat%2B18.44.18.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610300851439_Screenshot%2B2021-01-10%2Bat%2B18.44.18.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972263_Screenshot%2B2021-01-10%2Bat%2B14.49.22.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972263_Screenshot%2B2021-01-10%2Bat%2B14.49.22.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972278_Screenshot%2B2021-01-10%2Bat%2B14.49.41.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972278_Screenshot%2B2021-01-10%2Bat%2B14.49.41.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972286_Screenshot%2B2021-01-10%2Bat%2B14.59.52.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972286_Screenshot%2B2021-01-10%2Bat%2B14.59.52.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972296_Screenshot%2B2021-01-10%2Bat%2B15.01.35.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972296_Screenshot%2B2021-01-10%2Bat%2B15.01.35.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972308_Screenshot%2B2021-01-10%2Bat%2B15.02.24.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1610287972308_Screenshot%2B2021-01-10%2Bat%2B15.02.24.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXTRAS&lt;/strong&gt;:&lt;br&gt;
So far we've seen string, number, email etc validation. What about arrays, Objects, and array of objects? Yeah, I got you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Array
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meta:Joi.array()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above validates an array.&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456094873_Screenshot%2B2021-07-16%2Bat%2B17.54.16.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456094873_Screenshot%2B2021-07-16%2Bat%2B17.54.16.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456809071_Screenshot%2B2021-07-16%2Bat%2B17.52.54.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456809071_Screenshot%2B2021-07-16%2Bat%2B17.52.54.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Object
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meta:Joi.object()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above validates an Object.&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456162558_Screenshot%2B2021-07-16%2Bat%2B17.55.15.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456162558_Screenshot%2B2021-07-16%2Bat%2B17.55.15.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456168049_Screenshot%2B2021-07-16%2Bat%2B17.56.05.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456168049_Screenshot%2B2021-07-16%2Bat%2B17.56.05.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Joi.alternatives()
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Joi.alternatives()&lt;/code&gt; can be used to pass  many alternatives like array, object, string etc. For example, in a scenario where you're either expecting an array or object, especially when you depend on an external API and you can't be so sure if the response would be an array or an object.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meta:Joi.alternatives().try(Joi.object(), Joi.array())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456325713_Screenshot%2B2021-07-16%2Bat%2B17.52.54.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456325713_Screenshot%2B2021-07-16%2Bat%2B17.52.54.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456417885_Screenshot%2B2021-07-16%2Bat%2B17.56.05.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456417885_Screenshot%2B2021-07-16%2Bat%2B17.56.05.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, you can go step further to validate the items in the array or object.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Joi.array().items(Joi.string())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456457657_Screenshot%2B2021-07-16%2Bat%2B18.05.24.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456457657_Screenshot%2B2021-07-16%2Bat%2B18.05.24.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456482610_Screenshot%2B2021-07-16%2Bat%2B18.05.39.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456482610_Screenshot%2B2021-07-16%2Bat%2B18.05.39.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Joi.array().items(Joi.object())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456508612_Screenshot%2B2021-07-16%2Bat%2B18.09.16.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456508612_Screenshot%2B2021-07-16%2Bat%2B18.09.16.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456757429_Screenshot%2B2021-07-16%2Bat%2B18.32.12.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%2Fpaper-attachments.dropbox.com%2Fs_EB38424D386749E635CCDF8757FD937DB6738220A46C64FBDC64FF4DB41D7B53_1626456757429_Screenshot%2B2021-07-16%2Bat%2B18.32.12.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Joi is super cool and I would recommend it for server-side validation. &lt;/p&gt;

&lt;p&gt;Check Joi docs  &lt;a href="https://joi.dev/" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;See Project  &lt;a href="https://glitch.com/edit/#!/joi-validation" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Do you like this article? Hit me up on  &lt;a href="https://twitter.com/femioba_" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;  or  &lt;a href="https://www.linkedin.com/in/olufemi-obafunmiso/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;/p&gt;

</description>
      <category>node</category>
      <category>api</category>
      <category>javascript</category>
      <category>express</category>
    </item>
    <item>
      <title>How to Return multiple functions and values while working with REST APIs (Part 2)</title>
      <dc:creator>Olufemi obafunmiso</dc:creator>
      <pubDate>Wed, 10 Feb 2021 13:20:38 +0000</pubDate>
      <link>https://forem.com/olufemi/how-to-return-multiple-functions-and-values-while-working-with-rest-apis-part-2-687</link>
      <guid>https://forem.com/olufemi/how-to-return-multiple-functions-and-values-while-working-with-rest-apis-part-2-687</guid>
      <description>&lt;p&gt;In this part 2, we'll be using functions native to Javascript except of course &lt;code&gt;Axios&lt;/code&gt; library to make API calls. &lt;/p&gt;

&lt;p&gt;Here's the concept of returning multiple values&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;multipleAPI&lt;/span&gt; &lt;span class="o"&gt;=&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;joke&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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.chucknorris.io/jokes/random&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="nx"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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.chucknorris.io/jokes/categories&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

 &lt;span class="c1"&gt;// This returns the response from joke and categories&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;joke&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;//Call the function&lt;/span&gt;
    &lt;span class="nf"&gt;multipleAPI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;To return multiple values, pass it in an array  &lt;code&gt;return [joke, categories]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll be achieving the same result   as we did  in &lt;a href="https://dev.to/olufemi/how-to-return-multiple-functions-and-values-while-working-with-rest-apis-part-1-2cm7"&gt;part 1&lt;/a&gt;&lt;br&gt;
but this time without &lt;code&gt;q library&lt;/code&gt; functions like &lt;code&gt;.spread()&lt;/code&gt; , &lt;code&gt;q.fcall&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We're purely using functions native to Javascript just in case a library is deprecated or a version is deprecated, we won't be stuck 😉 &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%2Fpaper-attachments.dropbox.com%2Fs_2A85FCEB16F65ED0E222DA87A0DE2CB291B5ABE1CD3AD8F43080391C5383CE7B_1609929483089_Screenshot%2B2021-01-06%2Bat%2B11.35.58.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%2Fpaper-attachments.dropbox.com%2Fs_2A85FCEB16F65ED0E222DA87A0DE2CB291B5ABE1CD3AD8F43080391C5383CE7B_1609929483089_Screenshot%2B2021-01-06%2Bat%2B11.35.58.png"&gt;&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_2A85FCEB16F65ED0E222DA87A0DE2CB291B5ABE1CD3AD8F43080391C5383CE7B_1609929512566_Screenshot%2B2021-01-06%2Bat%2B11.37.27.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%2Fpaper-attachments.dropbox.com%2Fs_2A85FCEB16F65ED0E222DA87A0DE2CB291B5ABE1CD3AD8F43080391C5383CE7B_1609929512566_Screenshot%2B2021-01-06%2Bat%2B11.37.27.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two functions &lt;code&gt;fetchJokes&lt;/code&gt; and &lt;code&gt;callJoke&lt;/code&gt; were created. These are just variable names, you can use whatever name you really want.&lt;/p&gt;

&lt;p&gt;In the function declaration of &lt;code&gt;fetchJokes&lt;/code&gt; all API calls were made and  the responses returned accordingly i.e &lt;code&gt;return [joke, categories]&lt;/code&gt; in &lt;code&gt;Line 10&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The&lt;code&gt;fetchJokes&lt;/code&gt; function is then invoked in the &lt;code&gt;callJoke&lt;/code&gt; function, It's response is destructured in &lt;code&gt;Line 17&lt;/code&gt;.  You can checkout more on destructing &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the categories API returns up to 15 categories, In order to minimize the number of data exposed, I decided to generate a random number between 0-15, as shown on &lt;code&gt;Line 19&lt;/code&gt;. The random number generated was then passed as an index to the array response returned from the categories API as shown on &lt;code&gt;Line 26&lt;/code&gt;. Please note that this is not compulsory, you can achieve this however you see fit 😉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Line 31&lt;/code&gt; is very important !!!&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is where &lt;code&gt;callJoke()&lt;/code&gt; is called or triggered. If this was not called, the block code  &lt;code&gt;Line 16-29&lt;/code&gt; won't run. Also, note  &lt;code&gt;callJoke()&lt;/code&gt; was called outside the block of code &lt;code&gt;Line 16-29&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now let's run our APP&lt;/strong&gt; 🚀🚀🚀&lt;/p&gt;

&lt;p&gt;On   &lt;code&gt;Line 33&lt;/code&gt; I have set up my app to run on &lt;code&gt;port 3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I'm using nodemon on my local machine, so I'm running this command; &lt;code&gt;nodemon app.js&lt;/code&gt; [&lt;em&gt;You can install &lt;code&gt;nodemon&lt;/code&gt; as a dev dependency &lt;code&gt;npm install --save-dev&lt;/code&gt;&lt;/em&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748665365_Screenshot%2B2020-06-10%2B01.24.05.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748665365_Screenshot%2B2020-06-10%2B01.24.05.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open your Postman or Insomnia or even your browser since it's a GET request &lt;/p&gt;

&lt;p&gt;Make a request to : &lt;a href="http://localhost:3000/chuck-norris" rel="noopener noreferrer"&gt;http://localhost:3000/chuck-norris&lt;/a&gt;&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748910421_Screenshot%2B2020-06-10%2B01.26.56.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748910421_Screenshot%2B2020-06-10%2B01.26.56.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voila 🎇 &lt;/p&gt;

&lt;p&gt;Everything is working!&lt;/p&gt;

&lt;p&gt;We've been able to return multiple functions and values while working with REST APIs both with &lt;code&gt;q library&lt;/code&gt; in &lt;a href="https://dev.to/olufemi/how-to-return-multiple-functions-and-values-while-working-with-rest-apis-part-1-2cm7"&gt;part 1&lt;/a&gt; and native Javascript functions in Part 2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXTRAS:&lt;/strong&gt;&lt;br&gt;
As a developer, you should always have validation in mind and be 100 steps ahead 😂. Imagine if no data is returned when  &lt;code&gt;fetchJokes()&lt;/code&gt; is called on &lt;code&gt;Line 20&lt;/code&gt; ?. This will cause a code break in &lt;code&gt;Line 25 -26&lt;/code&gt;. To mitigate this,  just after &lt;code&gt;line 20&lt;/code&gt;, before declaring the response variable on &lt;code&gt;Line 21&lt;/code&gt;, we can do a check to be sure that the API returned a data response before proceeding, if not throw an error response.&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;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;joke&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nx"&gt;res&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;joke not available&lt;/span&gt;&lt;span class="dl"&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;ERROR_RESPONSE_SENT&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;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
         &lt;span class="nx"&gt;res&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;categories not available&lt;/span&gt;&lt;span class="dl"&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;ERROR_RESPONSE_SENT&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe that after returning the error response, I ensured that I explicitly break out of the scope &lt;code&gt;throw new Error('ERROR_RESPONSE_SENT');&lt;/code&gt;&lt;br&gt;
The reason is so that the other lines of code do not continue to run after I have returned the response. A Javascript developer &lt;strong&gt;MUST&lt;/strong&gt; keep this in mind. EXPLICITLY break out of scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy coding&lt;/strong&gt; 🍻 &lt;/p&gt;

&lt;p&gt;See Project &lt;a href="https://glitch.com/edit/#!/chuck-norris-2" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code review credit : &lt;a href="https://www.linkedin.com/in/jimioniayomide/" rel="noopener noreferrer"&gt;Jimi Ayomide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do you like this article? Hit me up on &lt;a href="https://twitter.com/femioba_" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://www.linkedin.com/in/olufemi-obafunmiso/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>express</category>
      <category>node</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Return multiple functions and values while working with REST APIs (Part 1)</title>
      <dc:creator>Olufemi obafunmiso</dc:creator>
      <pubDate>Wed, 13 Jan 2021 12:48:02 +0000</pubDate>
      <link>https://forem.com/olufemi/how-to-return-multiple-functions-and-values-while-working-with-rest-apis-part-1-2cm7</link>
      <guid>https://forem.com/olufemi/how-to-return-multiple-functions-and-values-while-working-with-rest-apis-part-1-2cm7</guid>
      <description>&lt;p&gt;As a developer, you interact with REST APIs directly or indirectly, every day at work. This makes it important now more than ever to keep learning and keep improving your REST development skills. &lt;/p&gt;

&lt;p&gt;In this part 1 of the series, I will show you how to use the &lt;code&gt;q library&lt;/code&gt; function &lt;code&gt;.spread()&lt;/code&gt;  to specify multiple functions to use as the callbacks and explore the possibilities with this library, while in part 2, we'll not be using the  &lt;code&gt;q library&lt;/code&gt;.  &lt;code&gt;q library&lt;/code&gt; is used for creating custom promises and can be quite handy when working with promises.&lt;/p&gt;

&lt;p&gt;We'll be exploring how to execute multiple functions at the same time and use &lt;code&gt;.spread()&lt;/code&gt; to grab the response from each of the functions. &lt;code&gt;.spread()&lt;/code&gt; is a &lt;code&gt;q library&lt;/code&gt; function which can be use as a replacement for &lt;code&gt;.then()&lt;/code&gt; .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have a promise for an array, you can use .&lt;code&gt;spread()&lt;/code&gt; as a replacement for &lt;code&gt;.then()&lt;/code&gt; The &lt;code&gt;spread&lt;/code&gt; function “spreads” the values over the arguments of the fulfillment handler. The rejection handler will get called at the first sign of failure. That is, whichever of&lt;br&gt;
the received promises fails first gets handled by the rejection handler. (Source:&lt;a href="https://documentup.com/kriskowal/q/" rel="noopener noreferrer"&gt;https://documentup.com/kriskowal/q/&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Here's the concept of returning multiple values and using &lt;code&gt;.spread()&lt;/code&gt;&lt;/strong&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;return&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="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spread&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="nx"&gt;c&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="c1"&gt;//&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;This comes in handy when building APIs that query multiple tables and/or calling multiple endpoints.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For the sake of this tutorial and to keep it simple, I'll be making use of &lt;code&gt;chuck-norris&lt;/code&gt; API &lt;a href="https://api.chucknorris.io/" rel="noopener noreferrer"&gt;https://api.chucknorris.io/&lt;/a&gt; &lt;br&gt;
This is a free JSON API for hand-curated Chuck Norris facts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The modules used:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Axios :&lt;/strong&gt; This module makes HTTP request seamless. Check it out &lt;a href="https://www.npmjs.com/package/axios" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;q :&lt;/strong&gt; This module is used for creating custom promises. Check it out &lt;a href="https://www.npmjs.com/package/q" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express:&lt;/strong&gt; Fast, unopinionated, minimalist web framework for &lt;a href="http://nodejs.org/" rel="noopener noreferrer"&gt;node&lt;/a&gt;. Check it out &lt;a href="https://www.npmjs.com/package/express" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The endpoints:&lt;/strong&gt;&lt;br&gt;
In this tutorial, we'll be making requests to two chuck-norris APIs&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jokes:&lt;/strong&gt; &lt;a href="https://api.chucknorris.io/jokes/random" rel="noopener noreferrer"&gt;https://api.chucknorris.io/jokes/random&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categories:&lt;/strong&gt; &lt;a href="https://api.chucknorris.io/jokes/categories" rel="noopener noreferrer"&gt;https://api.chucknorris.io/jokes/categories&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install all the  dependencies required for this task, run  &lt;code&gt;npm install q axios express&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's get our hands dirty&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927031596_Screenshot%2B2021-01-06%2Bat%2B10.51.27.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927031596_Screenshot%2B2021-01-06%2Bat%2B10.51.27.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 8&lt;/code&gt; : &lt;code&gt;q.fcall()&lt;/code&gt; is &lt;code&gt;q library&lt;/code&gt; function and it is used to create a promise.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 13&lt;/code&gt;: &lt;code&gt;return [joke, categories]&lt;/code&gt; stops the execution of the block of code and returns the HTTP request made to &lt;code&gt;chuck-norris&lt;/code&gt; API in &lt;code&gt;line 9 and 10&lt;/code&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927061483_Screenshot%2B2021-01-06%2Bat%2B10.55.43.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927061483_Screenshot%2B2021-01-06%2Bat%2B10.55.43.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 15&lt;/code&gt;: &lt;code&gt;.spread()&lt;/code&gt; works like &lt;code&gt;.then()&lt;/code&gt; but takes in multiple arguments unlike &lt;code&gt;.then()&lt;/code&gt; that takes up to two arguments: callback functions for the success and failure cases of the Promise. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;line 17 -18&lt;/code&gt;: I decide to filter the API response to what I needed. You can filter the response as you please also.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 22-27&lt;/code&gt; : I introduced &lt;code&gt;if&lt;/code&gt; statement logic to check if the returned response from the API contains data. This is purely me ensuring that I checked if &lt;code&gt;data&lt;/code&gt; field is returned in the response before proceeding.&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927110332_Screenshot%2B2021-01-06%2Bat%2B10.56.04.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927110332_Screenshot%2B2021-01-06%2Bat%2B10.56.04.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 31&lt;/code&gt; : The reason why I decided to randomize 0-15 is because the categories API returns close to 15-16 categories info which I really don't want to expose all, I preferred to randomly pick one as my response which is what I did in &lt;code&gt;Line 39&lt;/code&gt;. Again, this just me doing my thing 😃😃 not really necessary. You can do as you please 😉&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927229357_Screenshot%2B2021-01-06%2Bat%2B11.00.10.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1609927229357_Screenshot%2B2021-01-06%2Bat%2B11.00.10.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 34-42&lt;/code&gt;: I decided to create and structure my response. 😉 &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 43&lt;/code&gt;: Finally send back my response&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Line 45-47&lt;/code&gt; : I ensured I catch any error&lt;/p&gt;

&lt;p&gt;One thing I didn't mention which might be confusing for a beginner is &lt;code&gt;line 6&lt;/code&gt;&lt;br&gt;
I choose the endpoint name as &lt;code&gt;/chuck-norris&lt;/code&gt; based on my mood right now 😁 you can choose any name you want.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now let's run our APP&lt;/strong&gt; 🚀🚀🚀&lt;/p&gt;

&lt;p&gt;On &lt;code&gt;Line 49-52&lt;/code&gt; I have setup my app to run on &lt;code&gt;port 3000&lt;/code&gt;.&lt;br&gt;
I'm using nodemon on my local machine so I'm running this command; &lt;code&gt;nodemon app.js&lt;/code&gt; [You can install &lt;code&gt;nodemon&lt;/code&gt; as a dev dependency &lt;code&gt;npm install --save-dev&lt;/code&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748665365_Screenshot%2B2020-06-10%2B01.24.05.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748665365_Screenshot%2B2020-06-10%2B01.24.05.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open your Postman or Insomnia or even your browser since it's a get request&lt;br&gt;
Make a request to this endpoint: &lt;a href="http://localhost:3000/chuck-norris" rel="noopener noreferrer"&gt;http://localhost:3000/chuck-norris&lt;/a&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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748910421_Screenshot%2B2020-06-10%2B01.26.56.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%2Fpaper-attachments.dropbox.com%2Fs_D773CEEB668B1FF685C00AF1AD02488D4C7662A9D6AF3833BF43B9FF1D299AF7_1591748910421_Screenshot%2B2020-06-10%2B01.26.56.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voila 🎇 &lt;/p&gt;

&lt;p&gt;Everything is working!&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;q library&lt;/code&gt; functions , we (me and you 😉) were able to create a promise with &lt;code&gt;q.fcall()&lt;/code&gt; where I made two API request to chuck norris APIs and return the response of the two calls in an array and finally used &lt;code&gt;.spread()&lt;/code&gt; which is also a  &lt;code&gt;q library&lt;/code&gt; function that takes in multiple arguments to use as the callbacks.&lt;/p&gt;

&lt;p&gt;Happy coding 🍻&lt;/p&gt;

&lt;p&gt;See Project &lt;a href="https://glitch.com/edit/#!/chuck-norris-api" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do you like this article? Hit me up on &lt;a href="https://twitter.com/femioba_" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://www.linkedin.com/in/olufemi-obafunmiso/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>express</category>
      <category>api</category>
    </item>
  </channel>
</rss>
