<?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: Alberto Fernandez Medina</title>
    <description>The latest articles on Forem by Alberto Fernandez Medina (@albertofdzm).</description>
    <link>https://forem.com/albertofdzm</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%2F7664%2F790de97a-4a6b-4137-9c1a-57736ca620ef.png</url>
      <title>Forem: Alberto Fernandez Medina</title>
      <link>https://forem.com/albertofdzm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/albertofdzm"/>
    <language>en</language>
    <item>
      <title>Using Unity UI for in-game HUDs</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Wed, 14 Oct 2020 22:00:00 +0000</pubDate>
      <link>https://forem.com/genomagames/genoma-invaders-using-unity-ui-for-in-game-huds-pjc</link>
      <guid>https://forem.com/genomagames/genoma-invaders-using-unity-ui-for-in-game-huds-pjc</guid>
      <description>&lt;p&gt;This article covers how to implement a basic &lt;strong&gt;U&lt;/strong&gt; ser &lt;strong&gt;I&lt;/strong&gt; nterface on Unity using Unity UI to display info to players.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of Unity&lt;/li&gt;
&lt;li&gt;Complete &lt;a href="https://genomagames.com/genoma-invaders/03-unity-physics-2d-using-collider2d-and-kinematic-rigidbody2d/" rel="noopener noreferrer"&gt;“ &lt;strong&gt;Unity Physics 2D Using Collider2D and Kinematic Rigidbody2D&lt;/strong&gt; ”&lt;/a&gt; or checkout the code from &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/03" rel="noopener noreferrer"&gt;Genoma Invaders’ Github repository, branch &lt;code&gt;tutorial/03&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Last time we end up updating all the movement logic to be handled by Unity’s Physics engine and make use of its collision system to &lt;strong&gt;detect our player’s bullets colliding with the enemies to be destroyed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This time we’ll be showing the Score Points on the game screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unity’s UI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/UIToolkits.html" rel="noopener noreferrer"&gt;Unity has three types of “UI Toolkits”&lt;/a&gt; to display user interfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UIElements&lt;/strong&gt; : This is a new UI Toolkit in active development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unity UI&lt;/strong&gt; : This is the most used UI Toolkit for Unity until now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IMGUI&lt;/strong&gt; : This is a UI Toolkit commonly used to display development UIs due to its simplicity and ease to use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will be using &lt;a href="https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/index.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Unity UI&lt;/strong&gt;&lt;/a&gt; for our game UI, starting with the score display.&lt;/p&gt;

&lt;p&gt;To display our player’s score points, we will need to use the &lt;a href="https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIVisualComponents.html#text" rel="noopener noreferrer"&gt;&lt;strong&gt;Text Visual Component&lt;/strong&gt;&lt;/a&gt;. Let’s start by adding one to our Game Scene.&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F01-Unity_Hierarchy_Create_UI_Text.gif" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F01-Unity_Hierarchy_Create_UI_Text.gif" alt="01-Unity_Hierarchy_Create_UI_Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canvas and Layout
&lt;/h3&gt;

&lt;p&gt;As you can see, this will create 3 Game Objects in our Hierarchy Window, a Canvas containing Text, and something called EventSystem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/UICanvas.html" rel="noopener noreferrer"&gt;Canvas&lt;/a&gt; serves to define an area that will render UI components. It has different render options to help place UI Components all over our game world (checkout the docs!). The &lt;strong&gt;Render Mode&lt;/strong&gt; we will be using is the “Screen Space - Overlay” set by default.&lt;/li&gt;
&lt;li&gt;The Text Object is the one in charge of display our text.&lt;/li&gt;
&lt;li&gt;The EventSystem is a subsystem in charge of controlling the UI events and inputs. It handles navigation, input activation, and selection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select the Text Object and rename it to &lt;code&gt;Score Text&lt;/code&gt;, then go to its Text Component and put some placeholder score in its Text input (like &lt;code&gt;1978&lt;/code&gt;) to have a reference of how it would look.&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F02-Unity_Inspector_Text.jpg" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F02-Unity_Inspector_Text.jpg" alt="02-Unity_Inspector_Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you may probably have noticed that there is no text shown in the Scene Window. This happens because the Canvas, as we said, is like a sticker in our camera, it is not part of the game world. To center our Game Window in the Canvas Game Object, select it in the Hierarchy Window and then, with the cursor over the Game Window, press F, this will move the Game Window view to fit the Game Object you have selected, in this case, the Canvas.&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F03-Unity_Game_Object_Focus.gif" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F03-Unity_Game_Object_Focus.gif" alt="03-Unity_Game_Object_Focus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the canvas on sigh now, it’s time to position the Score Text, select it, and in its Inspector Window under the Rect Transform section, click on the icon similar to a red reticle, this is the Anchor Presets selector. Now with the Anchor Presets selector opened when pressing Shift+Alt&amp;lt;/kbd&amp;gt; you'll see that the selection icon change, select the one under the row with "top" label and the column with "right" label while pressing Shift+Alt&amp;lt;/kbd&amp;gt;. This will place the Score Text Object on the top right corner of the Canvas and anchor it.&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F04-Unity_UI_Object_Anchor_Preset.gif" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F04-Unity_UI_Object_Anchor_Preset.gif" alt="04-Unity_UI_Object_Anchor_Preset"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can read more about Rect Transform Component in &lt;a href="https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIBasicLayout.html" rel="noopener noreferrer"&gt;Unity UI Documentation - Basic Layout section&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;If you now switch to Game Window should see something like this.&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F05-Unity_Game_With_Score_UI.jpg" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F05-Unity_Game_With_Score_UI.jpg" alt="05-Unity_Game_With_Score_UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Unity UI Text Style
&lt;/h3&gt;

&lt;p&gt;Now that our Text is positioned in the Canvas, let’s give it some styles and appearance similar to our game visuals.&lt;/p&gt;

&lt;p&gt;First, we are going to change the font used for the text. We’ll be using &lt;strong&gt;Press Start 2P&lt;/strong&gt; you can download it from &lt;a href="http://www.zone38.net/font/#pressstart" rel="noopener noreferrer"&gt;codeman38’s webpage&lt;/a&gt; (the author). We placed the fonts under &lt;code&gt;/Assets/Genoma Invaders/Fonts/Press Start P2/&lt;/code&gt; to organize the project’s files.&lt;/p&gt;

&lt;p&gt;To change the font for the Score Text Object:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select it and change the Font Property under its Text Component.&lt;/li&gt;
&lt;li&gt;Set its Font Size Property to &lt;code&gt;8&lt;/code&gt; (this is the recommended size for this font),&lt;/li&gt;
&lt;li&gt;Update the Alignment to the right and centered vertically.&lt;/li&gt;
&lt;li&gt;Update the Color Property to be White (&lt;code&gt;FFFFFF&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F06-Unity_UI_Text_Styles.jpg" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F06-Unity_UI_Text_Styles.jpg" alt="06-Unity_UI_Text_Styles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a final tweak to adjust the size and position of the element, go to the Score Text Object’s Rect Transform Component and set the next properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pos X: -8&lt;/li&gt;
&lt;li&gt;Pos Y: -8&lt;/li&gt;
&lt;li&gt;Pos Z: 0&lt;/li&gt;
&lt;li&gt;Width: 64&lt;/li&gt;
&lt;li&gt;Height: 8&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; You should see the changes applied in the Game Window (remember to set the Taito 8080 resolution configured in the &lt;a href="https://genomagames.com/genoma-invaders/01-getting-started-with-unity-2d-game-development/#arcade-cabinet-taito-8080" rel="noopener noreferrer"&gt;first lesson&lt;/a&gt;).&lt;/em&gt;&lt;/small&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F07-Unity_Game_with_Score.jpg" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F07-Unity_Game_with_Score.jpg" alt="07-Unity_Game_with_Score"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating Unity UI Text
&lt;/h3&gt;

&lt;p&gt;The Score Text Object is ready to display our Game Score, and now we need some logic to update its Text value.&lt;/p&gt;

&lt;p&gt;Create a new C# Script in the Project Window called &lt;code&gt;Score.cs&lt;/code&gt; and place it under &lt;code&gt;/Assets/Genoma Invaders/UI/&lt;/code&gt; (new folder). We will use this Component to maintain the Score points for our Game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Score.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.UI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Score&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-Text.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Awake.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Awake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Start.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddScore&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&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;The previous code does set the Text value to the initial score (&lt;code&gt;0&lt;/code&gt;) whenever the Game Starts and update it when someone calls the method &lt;code&gt;AddScore&lt;/code&gt;. Attach it to the Score Text Object and Play the Game, you should see the Score Points to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With this new Component attached to the Text Score Object, we can use the &lt;code&gt;Score.AddScore&lt;/code&gt; method to increment our Game Score. Let’s update the &lt;code&gt;Enemy.cs&lt;/code&gt; to communicate with the Score Component inside the Score Text Object. We need to find and store a reference to the Score Component to call its &lt;code&gt;AddScore&lt;/code&gt; method whenever the player kills an Enemy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Enemy.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Enemy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Score&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Awake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Object.FindObjectOfType.html&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FindObjectOfType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Score&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.OnDestroy.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnDestroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Increment game score by 100&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;This way, whenever &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Object.Destroy.html" rel="noopener noreferrer"&gt;&lt;code&gt;Destroy&lt;/code&gt;&lt;/a&gt; method is called (remember that the Bullet Component is calling this method over the Enemy Object) with a Game Object containing an Enemy Component, it will update the Score points before being destroyed from the Scene.&lt;/p&gt;

&lt;p&gt;Let’s try it&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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F08-Unity_Game_with_Score_Change.gif" 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%2Fgenomagames.com%2Fgenoma-invaders%2Fassets%2Flesson-04%2F08-Unity_Game_with_Score_Change.gif" alt="08-Unity_Game_with_Score_Change"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We ended up with a game displaying a score text that updates whenever an enemy is killed and learning a bit about Unity UI systems.&lt;/p&gt;

&lt;p&gt;You can get the code generated by following this tutorial in &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/04" rel="noopener noreferrer"&gt;Genoma Invaders’ Github repository, branch &lt;code&gt;tutorial/04&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy Game Dev! 👾&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Unity Physics 2D Using Collider2D and Kinematic Rigidbody2D</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Tue, 25 Aug 2020 22:00:00 +0000</pubDate>
      <link>https://forem.com/genomagames/genoma-invaders-unity-physics-2d-using-collider2d-and-kinematic-rigidbody2d-47l5</link>
      <guid>https://forem.com/genomagames/genoma-invaders-unity-physics-2d-using-collider2d-and-kinematic-rigidbody2d-47l5</guid>
      <description>&lt;p&gt;Learn how to handle 2D game objects collisions while making a space invaders 2D game using the Unity physics 2D engine with 2D colliders and kinematic 2D rigid bodies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://store.unity.com/download?ref=personal"&gt;&lt;strong&gt;Unity 2020.1&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://visualstudio.microsoft.com/vs/"&gt;&lt;strong&gt;Visual Studio Editor&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Complete &lt;a href="https://dev.to/genomagames/getting-started-in-unity-2d-game-development-583k"&gt;“ &lt;strong&gt;How to Move 2D Objects in Unity&lt;/strong&gt; ”&lt;/a&gt; or checkout the code from &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/02"&gt;Genoma Invaders’ Github repository, branch &lt;code&gt;tutorial/02&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;In the last tutorial, we walked through &lt;strong&gt;How to Move 2D Objects in Unity&lt;/strong&gt; using the Unity’s Scripting API, ending up with a Scene containing a Player Game Object that moves when pressing directional input buttons and shooting bullets that move upwards in a consistent manner when a &lt;code&gt;Fire1&lt;/code&gt; related input is pressed.&lt;/p&gt;

&lt;p&gt;Our next steps will be to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make Bullets collide with the Enemies&lt;/li&gt;
&lt;li&gt;Organize our code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Until now, the Game Objects of our game were moving by updating its &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform-position.html"&gt;&lt;code&gt;Transform.position&lt;/code&gt;&lt;/a&gt; values by calling &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html"&gt;&lt;code&gt;Transform.Translate&lt;/code&gt;&lt;/a&gt; method. But, to let Unity detect collisions between objects, this is a bad practice, we need to change this approach to make use of Unity’s Physics 2D engine so that it can notify us about collisions between Game Objects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unity’s Kinematic Rigidbody2D, Moving Objects with Physics
&lt;/h2&gt;

&lt;p&gt;To move a Game Object using Unity’s 2D Physics we need to add &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-Rigidbody2D.html"&gt;&lt;code&gt;Rigidbody2D&lt;/code&gt;&lt;/a&gt; Component to it and call &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.MovePosition.html"&gt;&lt;code&gt;Rigidbody2D.MovePosition&lt;/code&gt;&lt;/a&gt; to move it, this way the Physics2D engine can handle the movement and take care of the physics calculations implied on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Player Movement with Physics
&lt;/h3&gt;

&lt;p&gt;Let’s start with the Player Game Object by adding the Rigidbody2D Component to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9WXUBYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/01-Unity_Inspector_Add_Rigidbody2D_to_Player.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9WXUBYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/01-Unity_Inspector_Add_Rigidbody2D_to_Player.gif" alt="01-Unity_Inspector_Add_Rigidbody2D_to_Player" width="405" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now there is a small point in adding physics to game objects in Unity. If you play the game, you will see how our Player Game Object now falls into the abyss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x-4rw2LA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/02-Unity-Game_Player_Falling.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x-4rw2LA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/02-Unity-Game_Player_Falling.gif" alt="02-Unity-Game_Player_Falling" width="398" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;“Goodbye dear friend!”&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;The Player Game Object is falling because Unity’s 2D Physics engine is now applying gravity to the Player Game Object. The thing is, we don’t want gravity in this game. We want them to move whenever we want them to move. We are only going to use Unity’s 2D Physics engine for collision detection. To achieve this, we need to switch the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-Rigidbody2D.html"&gt;&lt;code&gt;Rigidbody2D.bodyType&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;

&lt;p&gt;Using the Unity Inspector window, change the Player’s Rigidbody2D Body Type property to &lt;code&gt;Kinematic&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6VthJYmA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/03-Unity_Inspector_Change_Rigidbody2D_bodyType_to_Kinematic.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6VthJYmA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/03-Unity_Inspector_Change_Rigidbody2D_bodyType_to_Kinematic.gif" alt="03-Unity_Inspector_Change_Rigidbody2D_bodyType_to_Kinematic" width="276" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Now if you play the game will see that the Player stay still.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Kinematic Rigidbodies will ignore all forces and collision applied to them, so it will stay still unless moved by scripting. One thing more to do with the Rigidbody2D properties is to check “ &lt;strong&gt;Use Full Kinematics Contacts&lt;/strong&gt; ” checkbox to tell the Unity’s 2D Physics engine that this object can collide with other kinematic objects.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Checkout &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-Rigidbody2D.html"&gt;&lt;strong&gt;Unity’s Manual section “Rigidbody 2D”&lt;/strong&gt;&lt;/a&gt; to have more context about this topic.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RDR51Ojd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/04-Unity_Game_Player_Moving_with_Kinematic_Rigidbody2D.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RDR51Ojd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/04-Unity_Game_Player_Moving_with_Kinematic_Rigidbody2D.gif" alt="04-Unity_Game_Player_Moving_with_Kinematic_Rigidbody2D" width="400" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There, our Player is now in position. It’s time to update Player’s Component code to use &lt;code&gt;RigidBody2D&lt;/code&gt; instead of &lt;code&gt;Transform&lt;/code&gt; to move the Player Game Object.&lt;/p&gt;

&lt;p&gt;First, we need the Player Component to depends on Rigidbody2D Component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/RequireComponent.html&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;RequireComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rigidbody2D&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&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;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some code has been hidden under &lt;code&gt;// ...&lt;/code&gt; to show only relevant code.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;By using the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/RequireComponent.html"&gt;&lt;code&gt;RequireComponent&lt;/code&gt;&lt;/a&gt; Attribute, whenever a Player Component is added to a Game Object, if there is not Rigidbody2D Component attached, it will be added.&lt;/p&gt;

&lt;p&gt;Now we need the Player Component to store a reference to the RigidBody2D Component to communicate with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;bullet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Rigidbody2D&lt;/span&gt; &lt;span class="n"&gt;rb2D&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Awake.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Awake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Component.GetComponent.html&lt;/span&gt;
        &lt;span class="n"&gt;rb2D&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Rigidbody2D&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&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;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;We have added a new method to our Player Component called &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Awake.html"&gt;&lt;code&gt;Awake&lt;/code&gt;&lt;/a&gt;, and inside we are using &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Component.GetComponent.html"&gt;&lt;code&gt;GetComponent&lt;/code&gt;&lt;/a&gt; method to obtain a reference to the attached Rigidbody2D. &lt;code&gt;Awake&lt;/code&gt; method serves to hook any logic needed for our Component when the game starts a Scene or when a Game Object containing this Component is instantiated. It is usually used to setup references like we did for the Rigidbody2D Component.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; To get more info about this topic checkout &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/ExecutionOrder.html"&gt;Unity’s Manual section about “Order of Execution for Event Functions”&lt;/a&gt;.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Now that our Player Component has the reference to Rigidbody2D stored, we can focus on the logic to move the Game Object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;     // ...

     // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.html
     private Rigidbody2D rb2D;
&lt;span class="gi"&gt;+    // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-zero.html
+    private Vector3 move = Vector3.zero;
&lt;/span&gt;
     private void Awake()
     {
         // ...
     }

     private void Update()
     {
         // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Input.GetAxisRaw.html
         float rawHorizontalAxis = Input.GetAxisRaw("Horizontal");

-        // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-zero.html
&lt;span class="gd"&gt;-        Vector3 direction = Vector3.zero;
-        direction.x = rawHorizontalAxis;
-
-        // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-deltaTime.html
-        float timeSinceLastFrame = Time.deltaTime;
-
-        Vector3 translation = direction * speed * timeSinceLastFrame;
-
-        // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html
-        transform.Translate(
-          translation
-        );
&lt;/span&gt;&lt;span class="gi"&gt;+        move.x = rawHorizontalAxis;
&lt;/span&gt;
         // ...
     }

+    // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.FixedUpdate.html
&lt;span class="gi"&gt;+    private void FixedUpdate()
+    {
+        if (move != Vector3.zero)
+        {
+            // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-fixedDeltaTime.html
+            Vector3 translation = move * speed * Time.fixedDeltaTime;
+            Vector3 newPosition = transform.position + translation;
+
+            // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.MovePosition.html
+            rb2D.MovePosition(newPosition);
+        }
+    }
&lt;/span&gt; }

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

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; The syntax shown here is in &lt;a href="https://en.wikipedia.org/wiki/Diff#Unified_format"&gt;&lt;code&gt;diff&lt;/code&gt; unified format&lt;/a&gt; to show replaced code. Due to syntax highlighter limitations, C# syntax colors are disabled.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Let’s explain the changes. We have removed all related old movement logic except the logic in charge of checking for movement input with &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Input.GetAxisRaw.html"&gt;&lt;code&gt;Input.GetAxisRaw&lt;/code&gt;&lt;/a&gt;, added a new private property to &lt;code&gt;Player&lt;/code&gt; class called &lt;code&gt;move&lt;/code&gt; of type &lt;code&gt;Vector3&lt;/code&gt; with a default value of &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-zero.html"&gt;&lt;code&gt;Vector3.zero&lt;/code&gt;&lt;/a&gt;, then we are updating the property &lt;code&gt;move.x&lt;/code&gt; value in &lt;code&gt;Player&lt;/code&gt;’s &lt;code&gt;Update&lt;/code&gt; method with the value retrieved from the horizontal axis input. We had defined a new method &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.FixedUpdate.html"&gt;&lt;code&gt;FixedUpdate&lt;/code&gt;&lt;/a&gt; to handle physics-related logic. In here, if &lt;code&gt;move&lt;/code&gt; property value differs from &lt;code&gt;Vector3.zero&lt;/code&gt;, it will calculate the Game Object translation based on the &lt;code&gt;move&lt;/code&gt; and the &lt;code&gt;speed&lt;/code&gt; values multiplying it by the time passed (in this case &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-fixedDeltaTime.html"&gt;&lt;code&gt;Time.fixedDeltaTime&lt;/code&gt;&lt;/a&gt;). This computed translation is added to the current position. Then we call &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.MovePosition.html"&gt;&lt;code&gt;Rigidbody2D.MovePosition&lt;/code&gt;&lt;/a&gt; method to move the Game Object. This way, the Player Game Object is moved by the Rigidbody2D Component and taken into account b the physics engine.&lt;/p&gt;

&lt;p&gt;If you play the game, there should be no difference in the movement or any noticeable changes. The difference here is that the physics engine works behind the curtains paying attention to each movement of our Player Game Object.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bullet Movement with Physics
&lt;/h3&gt;

&lt;p&gt;Now that we have done this with the Player, let’s do it with its Bullets.&lt;/p&gt;

&lt;p&gt;Go to your Project window in the Unity editor and attach a Rigidbody2D Component to Bullet Game Object Prefab. Remember to set it to Kinematic and to check the “Use Full Kinematics Contacts” checkbox. After this, you should play the game. If everything is configured correctly, the bullets should move straight up when shooting.&lt;/p&gt;

&lt;p&gt;Edit &lt;code&gt;Bullet.cs&lt;/code&gt; code and add the &lt;code&gt;RequireComponent&lt;/code&gt; attribute to require &lt;code&gt;Rigidbody2D&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Bullet.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/RequireComponent.html&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;RequireComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rigidbody2D&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bullet&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&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;Add the logic in &lt;code&gt;Bullet.cs&lt;/code&gt; to store the reference to the RigidBody2D Component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Bullet.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bullet&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Rigidbody2D&lt;/span&gt; &lt;span class="n"&gt;rb2D&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Awake.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Awake&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Component.GetComponent.html&lt;/span&gt;
        &lt;span class="n"&gt;rb2D&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Rigidbody2D&lt;/span&gt;&lt;span class="p"&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;And finally, update its logic to move using the physics engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Bullet.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt; ...
 public class Bullet : MonoBehaviour
 {
     // ...

     // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.html
     private Rigidbody2D rb2D;
&lt;span class="gi"&gt;+    // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-up.html
+    private Vector3 move = Vector3.up;
&lt;/span&gt;
     private void Awake()
     {
         // ...
     }

-    // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Update.html
&lt;span class="gd"&gt;-    private void Update()
-    {
-        // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-up.html
-        Vector3 direction = Vector3.up;
-
-        // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-deltaTime.html
-        float timeSinceLastFrame = Time.deltaTime;
-
-        Vector3 translation = direction * speed * timeSinceLastFrame;
-
-        // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html
-        transform.Translate(
-          translation
-        );
-    }
&lt;/span&gt;&lt;span class="gi"&gt;+    // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.FixedUpdate.html
+    private void FixedUpdate()
+    {
+        if (move != Vector3.zero)
+        {
+            // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-fixedDeltaTime.html
+            Vector3 translation = move * speed * Time.fixedDeltaTime;
+            Vector3 newPosition = transform.position + translation;
+
+            // https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.MovePosition.html
+            rb2D.MovePosition(newPosition);
+        }
+    }
&lt;/span&gt; }

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

&lt;/div&gt;



&lt;p&gt;Notice that the &lt;code&gt;Update&lt;/code&gt; method has been removed since it is no longer needed, and we are using the same code as with the Player Component for the &lt;code&gt;FixedUpdated&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;No changes should be noticed when playing the game (physics engine working).&lt;/p&gt;

&lt;h3&gt;
  
  
  Enemies with physics
&lt;/h3&gt;

&lt;p&gt;Last but not least, update the Enemies Game Objects to have a Rigidbody2D of type Kinematic and “Use Full Kinematics Contacts” checkbox checked.&lt;/p&gt;

&lt;p&gt;And update its &lt;code&gt;Enemy.cs&lt;/code&gt; Component code to require and store the reference of &lt;code&gt;Rigidbody2D&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Enemy.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;RequireComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rigidbody2D&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Enemy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Rigidbody2D.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Rigidbody2D&lt;/span&gt; &lt;span class="n"&gt;rb2D&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Awake.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Awake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Component.GetComponent.html&lt;/span&gt;
        &lt;span class="n"&gt;rb2D&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Rigidbody2D&lt;/span&gt;&lt;span class="p"&gt;&amp;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;This one was the hardest. We are not going to implement any movement logic yet on the Enemy.&lt;/p&gt;

&lt;p&gt;Yay! We have finished providing our Game Objects with physic properties and movement. Play the game to ensure everything moves correctly, and nothing falls into the void. It’s time to make things clash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unity’s Collider2D, Detecting Collisions
&lt;/h2&gt;

&lt;p&gt;Now that Game Objects has physical body representation, the physics engine needs a way to detects collisions between these bodies. This can be made using &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/Collider2D.html"&gt;2D Colliders&lt;/a&gt;. There are several types of Collider2D based in their shape, we will use &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-BoxCollider2D.html"&gt;Box Collider 2D&lt;/a&gt; Component given its simplicity and that we do not need complicated shapes yet for the project.&lt;/p&gt;

&lt;p&gt;To make a collision possible, we need 2 Game Objects with Colliders2D attached to them to communicate collisions between them. We are going to make our Bullets collide with Enemies Game Objects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bullet to Enemy Collision
&lt;/h3&gt;

&lt;p&gt;Start with the Bullet Game Object Prefab. Open the Bullet Prefab on the Editor by making double click on it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q04h6uEJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/05-Unity_Bullet_Prefab_Editor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q04h6uEJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/05-Unity_Bullet_Prefab_Editor.gif" alt="05-Unity_Bullet_Prefab_Editor" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the Box Collider 2D Component, check “Is Trigger” box, this will set the collider to act as a trigger making the physics engine notify the collisions rather than simulate them. Set the Size property to &lt;code&gt;X = 0.125&lt;/code&gt; and &lt;code&gt;Y = 0.25&lt;/code&gt; units. This size makes the Collider area equal in size to the Sprite, the Bullet Sprite have a size of 2x4 pixels, that translated to game units (1 unit -&amp;gt; 16 pixels) is equal to &lt;code&gt;2 / 16 = 0.125&lt;/code&gt; and &lt;code&gt;4 /16 = 0.25&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rR8_MME5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/06-Unity_Inspector_Bullet_Box_Collider_2D.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rR8_MME5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/06-Unity_Inspector_Bullet_Box_Collider_2D.jpg" alt="06-Unity_Inspector_Bullet_Box_Collider_2D" width="511" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do the same for both Enemy Game Objects in the Game Scene, this time the Size is &lt;code&gt;X = 0.5&lt;/code&gt; and &lt;code&gt;Y = 0.5625&lt;/code&gt; (8x9 pixels), and we will need to set Offset property &lt;code&gt;Y = 0.03125&lt;/code&gt; (this moves the collider 0.5 pixels up to center it with the sprite).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--syKkAb1M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/07-Unity_Inspector_Enemy_Box_Collider_2D.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--syKkAb1M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/07-Unity_Inspector_Enemy_Box_Collider_2D.jpg" alt="07-Unity_Inspector_Enemy_Box_Collider_2D.jpg" width="382" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;copy Components with its property values to other Game Object using the Inspector Window&lt;/strong&gt;. Click on the “3 dots button” at the top left corner of the Enemy’s Box Collider 2D Component, select “Copy Component”, then select the other Enemy Game Object and click on the “3 dots button” at the top left corner of its Transform Component, select “Paste Component As New”. This will attach a new Box Collider 2D Component to the Game Object with the same property values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iJxgq_ga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/08-Unity_Inspector_Component_Copy_Paste.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iJxgq_ga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/08-Unity_Inspector_Component_Copy_Paste.gif" alt="08-Unity_Inspector_Component_Copy_Paste.gif" width="752" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have two kinds of Game Objects (Bullets and Enemies) with physical bodies and collision detection, we can handle collisions between them. If you play the game, there shouldn’t be any relevant changes (nothing falls and bullets still pass through).&lt;/p&gt;

&lt;p&gt;Coding time! Edit the Bullet Component script. We are going to add a new method called &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.OnTriggerEnter2D.html"&gt;OnTriggerEnter2D&lt;/a&gt;. This method is called whenever a collision is detected by any Collider2D attached to the Game Object with property “Is Trigger” enabled. It will be called when our Bullet Game Objects collide with the Enemy’s Collider2D.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Bullet.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bullet&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.OnTriggerEnter2D.html&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnTriggerEnter2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Collider2D&lt;/span&gt; &lt;span class="n"&gt;collider2D&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Component.CompareTag.html&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collider2D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CompareTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enemy"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;//https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Object.Destroy.html&lt;/span&gt;
            &lt;span class="nf"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collider2D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gameObject&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="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The Bullet Component is now detecting collisions. To avoid it from destroying every Collider2D it collides with, we have added a condition to check if the Game Object it collides with has the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/Tags.html"&gt;Tag&lt;/a&gt; “Enemy” and destroying it if so. But wait, if you play the game still nothing happens, we need to tag our Enemy Game Objects with the “Enemy” tag.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unity Tags for Collider Filtering
&lt;/h3&gt;

&lt;p&gt;To set a Tag in our Enemy Game Object, select the Enemy in the Editor and go to the Inspector Window, the Tag select input is placed in the upper part of the Inspector Window. We need to add a new one, to add a new Tag click on the Tag input, and select the “Add Tag…” option, then add the “Enemy” Tag.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lDB41NS4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/09-Unity_Inspector_Add_Enemy_Tag.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lDB41NS4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/09-Unity_Inspector_Add_Enemy_Tag.gif" alt="09-Unity_Inspector_Add_Enemy_Tag" width="483" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now select both Enemy Game Objects and add to them the “Enemy” Tag. If you play the game, you can now kill enemies. Pew! Pew!.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UvI3bgpP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/10-Unity_Game_Bullet_Enemy_Destroy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UvI3bgpP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-03/10-Unity_Game_Bullet_Enemy_Destroy.gif" alt="10-Unity_Game_Bullet_Enemy_Destroy.gif" width="503" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We have covered a lot in this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Represent Game Objects in Unity as physic bodies to be handled and moved by its 2D Physics engine&lt;/li&gt;
&lt;li&gt;Detect collisions between Game Objects and apply some logic to it&lt;/li&gt;
&lt;li&gt;Manage Tags in a Unity Project and tag Game Objects to be filtered during collision detection logics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can get the code generated by following this tutorial in &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/03"&gt;Genoma Invaders’ Github repository, branch &lt;code&gt;tutorial/03&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Remember to dig into documentation sites to have more context on what does what:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/index.html"&gt;Unity 2020.1 Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/index.html"&gt;Unity 2020.1 Script Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/"&gt;Microsoft .NET C# Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Game Dev! 👾&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Getting Started in Unity 2D Game Development</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Sun, 02 Aug 2020 16:28:53 +0000</pubDate>
      <link>https://forem.com/genomagames/getting-started-in-unity-2d-game-development-583k</link>
      <guid>https://forem.com/genomagames/getting-started-in-unity-2d-game-development-583k</guid>
      <description>&lt;p&gt;This tutorial covers some basic concepts about start developing 2D games in Unity. Game Object, Components, Sprites, how to handle Pixel Art for games in Unity, and helps to get used to Unity editor interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;To follow this Unity tutorial, you will need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://unity3d.com/es/get-unity/download"&gt;Install UnityHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genomagames.com/tutorials/unity/2020/07/02/how-to-install-unity-2020/"&gt;Install Unity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genomagames.com/tutorials/unity/2020/07/16/how-to-create-a-unity-2d-project/"&gt;Create a new 2D Game Unity Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/UsingTheEditor.html"&gt;Have basic knowledge about Unity's interface&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Genoma Invaders Game
&lt;/h2&gt;

&lt;p&gt;The game we will be developing during this tutorial series is &lt;strong&gt;Genoma Invaders&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Genoma Invaders is a &lt;a href="https://en.wikipedia.org/wiki/Category:Fixed_shooters"&gt;Fixed shooter&lt;/a&gt; from the &lt;a href="https://en.wikipedia.org/wiki/Shoot_%27em_up"&gt;Shoot 'em up&lt;/a&gt; game genre where you are a microscopic submarine killing bacteria, virus, and other microorganisms inside a human body.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To define this project and its scope, a very simple &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/01/docs/game-design-document.md"&gt;Game Design Document&lt;/a&gt; has been created.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Don't use this project as an example for game design as there is not much design process behind this project due to its educational purpose&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project File Structure
&lt;/h2&gt;

&lt;p&gt;It is not mandatory, but a way to keep things tidy is to create a new directory inside &lt;code&gt;/Assets&lt;/code&gt; with the name of your game, in this case, &lt;code&gt;/Assets/Genoma Invaders&lt;/code&gt;, and move the &lt;code&gt;Scenes&lt;/code&gt; directory inside of it. This way, all the game-related assets are contained inside this directory so they do not get mixed with 3rd party assets or plugins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the First Game Scene
&lt;/h2&gt;

&lt;p&gt;Let's start with the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/CreatingScenes.html"&gt;&lt;strong&gt;Scene&lt;/strong&gt;&lt;/a&gt; Unity creates whenever you create a new project by renaming it from &lt;code&gt;SampleScene&lt;/code&gt; to &lt;code&gt;Game&lt;/code&gt;. Here is where all the game action will happen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WNrMBVP8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/01-Unity_2020.1_blank_2D_project.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WNrMBVP8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/01-Unity_2020.1_blank_2D_project.png" alt="01-Unity_2020_blank_2D_project" width="880" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every game in Unity is contained within one or multiple scenes. For this project, we will be using them to store one level in each one and the main menu in another one, but for now, we only need one to start our game development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Game Objects
&lt;/h3&gt;

&lt;p&gt;The next item smaller than a Unity scene is a &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/GameObjects.html"&gt;&lt;strong&gt;Game Object&lt;/strong&gt;&lt;/a&gt;. They comprehend the bricks to build a game, graphics, sounds, and logic. A Game Object can represent multiple things in a Unity game, players, enemies, lights, the ground, trees, cameras. These objects can also represent things that the player can not see, like the camera itself or an object in charge of reviving the player whenever it dies.&lt;/p&gt;

&lt;p&gt;Unity starts a project always by placing a &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-Camera.html"&gt;&lt;strong&gt;Camera&lt;/strong&gt;&lt;/a&gt; Game Object inside the Scene (depending on the project template it could put more stuff). A Camera is essential since it represents the player's eyes as they will see what the camera sees. Do not mind it too much since we will not be handling it yet.  &lt;/p&gt;

&lt;p&gt;A Game Object will represent the player. To create Game Objects in the Scene, click on the menu &lt;code&gt;GameObject &amp;gt; 2D Object &amp;gt; Sprite&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7TzwNuPN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/02-Unity_GameObject_2D_Object_Sprite_menu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7TzwNuPN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/02-Unity_GameObject_2D_Object_Sprite_menu.png" alt="02-Unity_GameObject_2D_Object_Sprite_menu" width="667" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will create a new Game Object in the Scene called &lt;code&gt;New Sprite&lt;/code&gt;. Rename it to &lt;code&gt;Player&lt;/code&gt; and ensure its position is in &lt;code&gt;X=0 Y=0 Z=0&lt;/code&gt; in the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/UsingTheInspector.html"&gt;&lt;strong&gt;Inspector window&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_kvNdx89--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/03-Unity_Inspector_Player_Game_Object.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_kvNdx89--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/03-Unity_Inspector_Player_Game_Object.png" alt="03-Unity_Inspector_Player_Game_Object" width="448" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;p&gt;This Game Object we renamed &lt;code&gt;Player&lt;/code&gt; should show a &lt;strong&gt;Sprite Renderer&lt;/strong&gt; in the Inspector window.&lt;/p&gt;

&lt;p&gt;Each section in the Inspector window, divided by a line and a header, represents a &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/Components.html"&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/a&gt; which is the next piece smaller than a Game Object. Game Objects contains Components that provide different features to the Game Object, the most common Component you can find in a Game Object is the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-Transform.html"&gt;&lt;strong&gt;Transform&lt;/strong&gt;&lt;/a&gt; Component. It gives the Game Object the ability to be positioned, rotated, or scaled inside the Scene, so if the Game Object renders something, it will be placed based on that values or could calculate its distance against other entities in the Scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sprites
&lt;/h3&gt;

&lt;p&gt;Time to inject some graphics into the game. Take this &lt;a href="https://genomagames.com/genoma-invaders/assets/lesson-01/Player.png"&gt;Player sprite&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rzhh180j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/Player.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rzhh180j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/Player.png" alt="Player" width="16" height="16"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And put it into the project. You can do it by dragging it into the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/ProjectView.html"&gt;&lt;strong&gt;Project window&lt;/strong&gt;&lt;/a&gt; or placing it with your operating system file explorer into the project &lt;code&gt;Assets&lt;/code&gt; directory. Place it under &lt;code&gt;Assets/Genoma Invaders/Player/Player.png&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let assign the Player sprite to the Player Game Object in the Scene:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select the Player in the Scene &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/Hierarchy.html"&gt;&lt;strong&gt;Hierarchy window&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;In the Inspector window, on the &lt;strong&gt;Sprite Renderer&lt;/strong&gt; component, click on the circle of the left to the Sprite field to open the &lt;strong&gt;Select Sprite&lt;/strong&gt; window&lt;/li&gt;
&lt;li&gt;Select the Player sprite on the Select Sprite window&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mVu55K-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/04-Unity_Inspector_Sprite_Selection.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mVu55K-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/04-Unity_Inspector_Sprite_Selection.png" alt="04-Unity_Inspector_Sprite_Selection" width="880" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the Player entity is visible within the game Camera. To check this, go to the &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/GameView.html"&gt;&lt;strong&gt;Game view&lt;/strong&gt;&lt;/a&gt; view, you should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nG8h9Blz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/05-Unity_Game_Panel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nG8h9Blz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/05-Unity_Game_Panel.png" alt="05-Unity_Game_Panel" width="594" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That little dot is our &lt;strong&gt;Player&lt;/strong&gt; rendered by the camera. The reason it is so small is that the size of the sprite is 16x16 pixels. Sprites, Cameras, and settings in Unity need to be configured to render &lt;a href="https://en.wikipedia.org/wiki/Pixel_art"&gt;Pixel Art&lt;/a&gt; correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pixel Art in Unity
&lt;/h2&gt;

&lt;p&gt;To render pixel art correctly in Unity, we need to make a few changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unity Texture 2D Import Settings for Pixel Art
&lt;/h3&gt;

&lt;p&gt;The primary problem Unity has with Pixel Art is that it treats the images used for the Game Objects as Textures, and it applies some optimization over them to improve load and render times. The problem is that that optimization is useful only if we are working with large resolution images that need to be compressed or optimized. In the case of Pixel Art, these optimizations are not required since these graphics are so small in size. &lt;/p&gt;

&lt;p&gt;To configure Player Sprite with proper settings, select it on the Project window to display its settings on the Inspector window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i239v8EP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/06-Unity_Inspector_window_Texture_2D_Import_Settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i239v8EP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/06-Unity_Inspector_window_Texture_2D_Import_Settings.png" alt="06-Unity_Inspector_window_Texture_2D_Import_Settings" width="880" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pixels Per Unit&lt;/strong&gt;: 16 (It will make the sprite bigger in the Scene because when applying this value, it means that for this sprite 16 pixels will have to be rendered inside 1 game world unit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter Mode&lt;/strong&gt;: Point (no filter) (Will prevent blurriness with the pixels since that option is in charge of filtering the texture when it gets stretched)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression&lt;/strong&gt;: None (This prevents Unity from compressing the image that also will cause blurriness)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Press the &lt;strong&gt;Apply&lt;/strong&gt; button to save the changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1LyiO9Jv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/07-Unity_Inspector_window_Import_Settings_for_Pixel_Art_16_pixels.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1LyiO9Jv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/07-Unity_Inspector_window_Import_Settings_for_Pixel_Art_16_pixels.png" alt="07-Unity_Inspector_window_Import_Settings_for_Pixel_Art_16_pixels" width="442" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This process needs to be made with every sprite included in the project.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;If you look now in the Game view, the Player Sprite should look bigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GilbHCXx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/08-Unity_Game_view_pixel_player.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GilbHCXx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/08-Unity_Game_view_pixel_player.png" alt="08-Unity_Game_view_pixel_player" width="526" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2D Pixel Perfect Package
&lt;/h3&gt;

&lt;p&gt;Another tweak we can do to help the Unity project render pixel graphics is to install the &lt;a href="https://docs.unity3d.com/Packages/com.unity.2d.pixel-perfect@3.0/manual/index.html"&gt;&lt;strong&gt;2D Pixel Perfect&lt;/strong&gt;&lt;/a&gt; package.&lt;/p&gt;

&lt;h4&gt;
  
  
  2D Pixel Perfect Package Installation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;If you created the project selecting the 2D Project Template in Unity Hub you already have this package installed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To install the package, open the &lt;strong&gt;Package Manager&lt;/strong&gt; window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iYpkLByt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/09-Unity_Window_menu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iYpkLByt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/09-Unity_Window_menu.png" alt="09-Unity_Window_menu" width="563" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set &lt;strong&gt;Packages&lt;/strong&gt; option to show &lt;strong&gt;All&lt;/strong&gt; packages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tYlw0vtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/10-Unity_Package_Manager_window_Package_filter.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tYlw0vtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/10-Unity_Package_Manager_window_Package_filter.png" alt="10-Unity_Package_Manager_window_Package_filter" width="203" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the &lt;strong&gt;2D Pixel Perfect&lt;/strong&gt; package and the press the &lt;strong&gt;Install&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YzcOQhrM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/11-Unity_Package_Manager_2D_Pixel_Perfect_Install.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YzcOQhrM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/11-Unity_Package_Manager_2D_Pixel_Perfect_Install.png" alt="11-Unity_Package_Manager_2D_Pixel_Perfect_Install" width="804" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2D Pixel Perfect Package's Pixel Camera
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;2D Pixel Perfect&lt;/strong&gt; package comes with a &lt;strong&gt;Component&lt;/strong&gt; called &lt;strong&gt;Pixel Camera&lt;/strong&gt;. Unity Cameras are not prepared to render pixel graphics correctly, and this Component provides Unity's Cameras with behavior to handle pixel viewport logics and other features to help your game look more pixelated.&lt;/p&gt;

&lt;p&gt;Select the &lt;strong&gt;Main Camera&lt;/strong&gt; in the Hierarchy window to show its Inspector window. To add the &lt;strong&gt;Pixel Camera&lt;/strong&gt; Component to the Main Camera, click on the &lt;strong&gt;Add Component&lt;/strong&gt; button. Go to &lt;strong&gt;Rendering&lt;/strong&gt; and then select &lt;strong&gt;Pixel Perfect Camera&lt;/strong&gt; (you can also find it using the search input).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E1gzJuEk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/12-Unity_Add_Component_Pixel_Perfect_Camera.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E1gzJuEk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/12-Unity_Add_Component_Pixel_Perfect_Camera.png" alt="12-Unity_Add_Component_Pixel_Perfect_Camera" width="230" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the Main Camera has the Pixel Perfect Camera Component, edit its parameters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assets Pixels Per Unit:&lt;/strong&gt; 16 (the same value we used for the Player Sprite)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference Resolution:&lt;/strong&gt; 224x256 (you'll know why these values later)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upscale Render Texture:&lt;/strong&gt; checked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crop Frame:&lt;/strong&gt; X and Y checked&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xM06wk3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/13-Unity_Pixel_Perfect_Camera_Component.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xM06wk3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/13-Unity_Pixel_Perfect_Camera_Component.png" alt="13-Unity_Pixel_Perfect_Camera_Component" width="367" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; checkout &lt;a href="https://docs.unity3d.com/Packages/com.unity.2d.pixel-perfect@3.0/manual/index.html"&gt;2D Pixel Perfect package documentation&lt;/a&gt; for more info.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Arcade Cabinet Taito 8080
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Space_Invaders"&gt;Space Invaders&lt;/a&gt; were played in an &lt;a href="https://en.wikipedia.org/wiki/Arcade_cabinet"&gt;arcade cabinet&lt;/a&gt; with a &lt;a href="https://www.system16.com/hardware.php?id=629"&gt;Taito 8080&lt;/a&gt; motherboard which could render a resolution of 224x256 pixels.&lt;/p&gt;

&lt;p&gt;Unity can simulate resolutions and aspect ratios freely. Let's begin by setting up a new &lt;strong&gt;Aspect&lt;/strong&gt; configuration on the Game view:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aFj8D5J9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/14-Unity_Game_view_aspect_configuration_menu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aFj8D5J9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/14-Unity_Game_view_aspect_configuration_menu.png" alt="14-Unity_Game_view_aspect_configuration_menu" width="595" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To simulate a Taito arcade machine create a mew aspect with 224 with and 256 height:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ba0WryyE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/15-Unity_Game_view_new_aspect_form.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ba0WryyE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/15-Unity_Game_view_new_aspect_form.png" alt="15-Unity_Game_view_new_aspect_form" width="263" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the new aspect is selected, the Game view will change to represent this resolution. To try how the game looks under this resolution, press the &lt;strong&gt;Play&lt;/strong&gt; button and select it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vSVoYI6F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/16-Unity_Game_view_aspect_selected.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vSVoYI6F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/16-Unity_Game_view_aspect_selected.png" alt="16-Unity_Game_view_aspect_selected" width="515" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop the game by pressing the &lt;strong&gt;Play&lt;/strong&gt; button again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enemies
&lt;/h2&gt;

&lt;p&gt;Let's make the same process with this &lt;a href="https://genomagames.com/genoma-invaders/assets/lesson-01/Enemy.png"&gt;Enemy sprite&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BjL5O9hM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/Enemy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BjL5O9hM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/Enemy.png" alt="Enemy" width="16" height="16"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Place it under &lt;code&gt;/Assets/Genoma Invaders/Enemy/Enemy.png&lt;/code&gt; and update its settings as we did with the Player sprite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pixels Per Unit: 16&lt;/li&gt;
&lt;li&gt;Filter Mode: Point (no filter)&lt;/li&gt;
&lt;li&gt;Compression: None&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, to create the Enemy Game Object in the Scene, there is another way to create it. Drag and drop the Enemy Sprite from the Project window to the Hierarchy window, this will create a new Game Object with a Sprite Renderer Component called "Enemy" in the Scene. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hUdWyIic--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/17-Unity_Editor_create_sprite_object_in_scene.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hUdWyIic--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/17-Unity_Editor_create_sprite_object_in_scene.png" alt="17-Unity_Editor_create_sprite_object_in_scene" width="880" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have two visible game objects in the Scene let's place them where they suppose to be in the game. Move the Player and the Enemy to be positioned similar to this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NowRNuj3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/18-Unity_Editor_Scene_Game_Object_move.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NowRNuj3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/18-Unity_Editor_Scene_Game_Object_move.png" alt="18-Unity_Editor_Scene_Game_Object_move" width="456" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now select the Enemy Game Object and press Ctrl/Cmd + D, in the Hierarchy should appear an &lt;code&gt;Enemy (1)&lt;/code&gt; Game Object, you have just duplicated a Game Object, place it next to its partner, and you should end with something that starts to smell like a game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gA_Fq2NY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/19-Unity_Editor_Scene_Game_Object_duplication.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gA_Fq2NY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-01/19-Unity_Editor_Scene_Game_Object_duplication.png" alt="19-Unity_Editor_Scene_Game_Object_duplication" width="510" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;We have seen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to import Sprites in a Unity project&lt;/li&gt;
&lt;li&gt;How to create Game Objects in Unity&lt;/li&gt;
&lt;li&gt;How to add components to a Game Object in Unity&lt;/li&gt;
&lt;li&gt;How to adapt a Unity project, its camera, and sprites to be Pixel Art friendly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is all for now.&lt;/p&gt;

&lt;p&gt;The resulting work of this tutorial can be checked out in the &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/01"&gt;Genoma Invaders Github, branch &lt;code&gt;tutorial/01&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy Game Dev! 👾&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Move 2D Objects in Unity</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Fri, 31 Jul 2020 22:00:00 +0000</pubDate>
      <link>https://forem.com/genomagames/how-to-move-2d-objects-in-unity-573n</link>
      <guid>https://forem.com/genomagames/how-to-move-2d-objects-in-unity-573n</guid>
      <description>&lt;p&gt;This tutorial shows &lt;strong&gt;basics for Unity 2D Game Development concepts like adding custom components to Game Object, fundamental Unity scripting with C#, 2D Game Object movement in Unity, how to handle inputs in Unity, and how to instantiate Game Object in Unity&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;Due to this course's intention, we will not cover &lt;strong&gt;basic knowledge in programming with C# in Unity&lt;/strong&gt; but rather provide info with complex terms in this language or Unity Scripting API.&lt;/p&gt;

&lt;p&gt;To get more info and learn about these topics, you can refer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/"&gt;Microsoft's .NET C# Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/CreatingAndUsingScripts.html"&gt;Unity's Manual section "Creating and Using Scripts"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/index.html"&gt;Unity API Scripting Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codecademy.com/learn/learn-c-sharp"&gt;Codecademy's Learn C# Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.unity.com/"&gt;Unity Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Complete &lt;a href="https://dev.to/genomagames/getting-started-in-unity-2d-game-development-583k"&gt;"&lt;strong&gt;Getting Started in Unity 2D Game Development&lt;/strong&gt;"&lt;/a&gt; or checkout the code from &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/01"&gt;Genoma Invaders' Github repository, branch &lt;code&gt;tutorial/01&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Have &lt;strong&gt;basics knowledge in programming with &lt;a href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language)"&gt;C#&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://visualstudio.microsoft.com/es/vs/"&gt;&lt;strong&gt;Visual Studio Editor&lt;/strong&gt;&lt;/a&gt; (you should have installed it when installing Unity) or another code editor of your preference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the previous tutorial, &lt;a href="https://dev.to/genomagames/getting-started-in-unity-2d-game-development-583k"&gt;"Getting Started in Unity 2D Game Development"&lt;/a&gt;, we walk through basic concepts about developing 2D games in Unity, ending up with a scene with some still Game Objects. It’s time to give them some movement logic starting by the Player.&lt;/p&gt;

&lt;p&gt;This time we will &lt;strong&gt;learn to move 2D Object in Unity by scripting in C# using Game Components&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Components
&lt;/h2&gt;

&lt;p&gt;To move our Player, we will need to add some logic to its dumb Game Object. We will do it by creating a Custom Component containing C# code and adding it to the Player Game Object.&lt;/p&gt;

&lt;p&gt;Select the Player Game Object and press the “Add Component” button in the Inspector window. Then, write in the search input &lt;code&gt;Player&lt;/code&gt;, select &lt;code&gt;New Script&lt;/code&gt;, and press the “Create and Add” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qh15poW4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/01-Unity_Add_Player_Component.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qh15poW4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/01-Unity_Add_Player_Component.gif" alt="01-Unity_Add_Player_Component" width="413" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; checkout &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/CreatingComponents.html"&gt;Unity’s Manual section “Creating components with scripting”&lt;/a&gt; for more info.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;This action will create a C# file under &lt;code&gt;/Assets/Player.cs&lt;/code&gt; that defines a component named “Player”, and then it will add this Component to the Player Game Object. Move the &lt;code&gt;Player.cs&lt;/code&gt; file to &lt;code&gt;/Assets/Genoma Invaders/Player/&lt;/code&gt; directory using the Project window to maintain the project’s files organized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Player Controller
&lt;/h2&gt;

&lt;p&gt;The Player component will be the Player Controller or, in other words, the Component in charge of handle the player’s logic.&lt;/p&gt;

&lt;p&gt;If you open the file you’ll see this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Start is called before the first frame update&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&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="c1"&gt;// Update is called once per frame&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&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="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;That is the basic code structure Unity Editor creates for every script/component created in the project.&lt;/p&gt;

&lt;p&gt;Now we are going to make de same, and &lt;strong&gt;create an Enemy Custom Component for the Enemy Game Objects&lt;/strong&gt;. This time we are using a different technique. On the Project window, go to &lt;code&gt;/Assets/Genoma Games/Enemy&lt;/code&gt; right click on it to open the contextual menu and select &lt;code&gt;Create &amp;gt; C# Script&lt;/code&gt;, then name the file &lt;code&gt;Enemy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pmZsfxIb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/02-Unity_Project_create_new_csharp_script.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pmZsfxIb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/02-Unity_Project_create_new_csharp_script.gif" alt="02-Unity_Project_create_new_csharp_script" width="880" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;Enemy.cs&lt;/code&gt; file is created, Unity reloads for a sort time and will register a new component to be added to Game Object named &lt;code&gt;Enemy&lt;/code&gt;. Go ahead and add it to both Enemy Game Objects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6pYU8HI---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/03-Unity_Inspector_add_enemy_component.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6pYU8HI---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/03-Unity_Inspector_add_enemy_component.gif" alt="04-Unity_Inspector_add_enemy_component" width="399" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Remember to add the Enemy component to both enemies.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Game Object Movement
&lt;/h2&gt;

&lt;p&gt;To make the Player Game Object move, edit &lt;code&gt;Player.cs&lt;/code&gt; file. First, we will clean it up a bit, so it doesn’t have unnecessary code:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&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="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now, we will add some logic into its Player Controller’s &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/MonoBehaviour.Update.html"&gt;&lt;code&gt;Update&lt;/code&gt;&lt;/a&gt; loop method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-right.html&lt;/span&gt;
        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-deltaTime.html&lt;/span&gt;
        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deltaTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;translation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html&lt;/span&gt;
        &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="n"&gt;translation&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;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Visit any of the links in the code’s comments for more info.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;This code is creating a &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3.html"&gt;&lt;code&gt;Vector3&lt;/code&gt;&lt;/a&gt; pointing to the right (1, 0, 0) and multiplying it by time elapsed since the last frame, and then calls &lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html"&gt;&lt;code&gt;Transform.Translate&lt;/code&gt;&lt;/a&gt; method with the resulting Vector3 which will move the Game Object that distance.&lt;/p&gt;

&lt;p&gt;TL;DR; This will make the player move 1 Scene unit per second to the right.&lt;/p&gt;

&lt;p&gt;To see the result go to Unity Editor and press the “Play” button (You can use the keyboard shortcut Ctrl/Cmd+P).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p26nnb21--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/04-Unity_Editor_Player_moving_right.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p26nnb21--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/04-Unity_Editor_Player_moving_right.gif" alt="04-Unity_Editor_Player_moving_right" width="418" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s alive!!! But we need to be able to control this little guy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detect Player Input
&lt;/h2&gt;

&lt;p&gt;To control the Player, we need to use Unity’s &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-InputManager.html"&gt;Input Manager&lt;/a&gt;. With the &lt;a href="https://docs.unity3d.com/ScriptReference/Input.GetAxisRaw.html"&gt;&lt;code&gt;Input.GetAxisRaw&lt;/code&gt;&lt;/a&gt; method, you can retrieve the corresponding axis input value, in this case, if some left or right key is pressed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/ScriptReference/Input.GetAxisRaw.html&lt;/span&gt;
        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;rawHorizontalAxis&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAxisRaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Horizontal"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-zero.html&lt;/span&gt;
        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rawHorizontalAxis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-deltaTime.html&lt;/span&gt;
        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deltaTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;translation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html&lt;/span&gt;
        &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="n"&gt;translation&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;Now you can control the player.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z-awhnAa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/05-Unity_Editor_Player_moving_input.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z-awhnAa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/05-Unity_Editor_Player_moving_input.gif" alt="05-Unity_Editor_Player_moving_input" width="418" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The problem is, it is a bit slow. To fix this, we are going to add one more value to our player logic. Edit the Player component code, add a &lt;code&gt;speed&lt;/code&gt; property to it, and include this value in the &lt;code&gt;translation&lt;/code&gt; calculus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;

        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;translation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&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;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some code has been hidden under &lt;code&gt;// ...&lt;/code&gt; to show only applied changed.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Now the Player should move twice as fast if you try it. But there is one small problem here if we want to change our Player speed value we need to open its code and edit the value and then wait for Unity to recompile. Unity provides various ways to allow the exposure of properties in the editor so you can tweak as many values as you want without editing any code. You could set the property to be &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers"&gt;&lt;code&gt;public&lt;/code&gt;&lt;/a&gt; (which I don’t recommend to enforce &lt;a href="https://en.wikipedia.org/wiki/SOLID"&gt;code cleanliness&lt;/a&gt;), or you could add the &lt;a href="https://docs.unity3d.com/ScriptReference/SerializeField.html"&gt;&lt;code&gt;SerializeField&lt;/code&gt;&lt;/a&gt; attribute to the Player’s &lt;code&gt;speed&lt;/code&gt; property, we will do the second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&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;Now, if you go to the Unity Editor and checkout the Player Component at the Inspector window, you’ll see that now the Component has a new input called &lt;code&gt;Speed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kYo2kSyL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/06-Unity_Inspector_Player_Component_with_Speed_input.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kYo2kSyL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/06-Unity_Inspector_Player_Component_with_Speed_input.jpg" alt="06-Unity_Inspector_Player_Component_with_Speed_input" width="398" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;2&lt;/code&gt; we set for the &lt;code&gt;speed&lt;/code&gt; property will be a default value when the Component is added to a Game Object, and the final used value for the logic will be the one set at the editor. You can edit it even while playing to adjust it to your preferred value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OteTs15x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/07-Unity_Game_property_edit.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OteTs15x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/07-Unity_Game_property_edit.gif" alt="07-Unity_Game_property_edit" width="693" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Properties changed during Play mode will not be saved and will reset to its value before stating Play mode. More info in Unity’s Manual section “&lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/GameView.html"&gt;Game View&lt;/a&gt;“&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instantiate Game Objects
&lt;/h2&gt;

&lt;p&gt;Time to make our Player shoot some bullets. Download this &lt;a href="https://genomagames.com/genoma-invaders/assets/lesson-02/Bullet.png"&gt;Bullet sprite&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WMpzyNd_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/Bullet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WMpzyNd_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/Bullet.png" alt="Bullet" width="16" height="16"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And place it under &lt;code&gt;/Assets/Bullet/&lt;/code&gt; (new directory). Remember to edit the Sprite settings as we did with the Player and Enemy sprites in the &lt;a href="https://dev.to/genomagames/getting-started-in-unity-2d-game-development-583k"&gt;previous tutorial&lt;/a&gt;. Then use it to create a new Game Object in the Scene called Bullet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bRgOlBcc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/08-Unity_Editor_create_bullet_game_object.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bRgOlBcc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/08-Unity_Editor_create_bullet_game_object.gif" alt="08-Unity_Editor_create_bullet_game_object" width="692" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This Bullet Game Object will need custom logic to move and do stuff, so let’s create a new C# Script called Bullet and add its Component to the Bullet Game Object. Edit the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Bullet.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bullet&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Vector3-up.html&lt;/span&gt;
        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Time-deltaTime.html&lt;/span&gt;
        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deltaTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;translation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;timeSinceLastFrame&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Transform.Translate.html&lt;/span&gt;
        &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="n"&gt;translation&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;We have added similar logic to our Bullet Game Object as we did to the player, but this time it only moves upwards and with a higher speed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M4PRMBsF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/09-Unity_Game_bullet_moving.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M4PRMBsF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/09-Unity_Game_bullet_moving.gif" alt="09-Unity_Game_bullet_moving" width="597" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The problem now is that we only have one Bullet, and it appears and starts moving whenever we start playing. We need it only to appear when we are pressing the fire button. To achieve this, we will need to create a &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/Prefabs.html"&gt;Prefab&lt;/a&gt; from our Bullet Game Object.&lt;/p&gt;

&lt;p&gt;To &lt;strong&gt;create a Unity Prefab&lt;/strong&gt; from an already existing Game Object, you need to drag and drop it to the Project window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--as6DVDj4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/10-Unity_Editor_create_bullet_prefab.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--as6DVDj4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/10-Unity_Editor_create_bullet_prefab.gif" alt="10-Unity_Editor_create_bullet_prefab" width="560" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Prefab is like a blueprint of a Game Object. It allows us to create multiple copies of the same Game Object without having them in the Scene. If you take a look at the Hierarchy window, you will see that the Bullet Game Object now has a different color, icon, and a little arrow to the right, this is the way Unity indicates if a Game Object in the Scene is related with a Prefab. Delete this Game Object from the Scene.&lt;/p&gt;

&lt;p&gt;Check the Bullet Prefab properties within the Inspector window and ensure that it has Transform.position to &lt;code&gt;x=0 y=0 z=0&lt;/code&gt; and Bullet &lt;code&gt;speed=0&lt;/code&gt;. We need to update the Player’s logic to instantiate this Game Object whenever we press the “Fire1” button (which is mapped to &lt;code&gt;left ctrl&lt;/code&gt;, &lt;code&gt;mouse 0&lt;/code&gt; and &lt;code&gt;joystick button 0&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Checkout &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/class-InputManager.html"&gt;Unity’s Manual section “Input Manager”&lt;/a&gt; to know more on how to configure input mappings.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Player.cs&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&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;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;bullet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;

        &lt;span class="c1"&gt;// https://docs.unity3d.com/ScriptReference/Input.GetButtonDown.html&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetButtonDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fire1"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;playerPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Quaternion-identity.html&lt;/span&gt;
            &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bullet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;playerPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quaternion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;identity&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="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some code has been hidden under &lt;code&gt;// ...&lt;/code&gt; to show only applied changed.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;We have defined a new Player Component property called &lt;code&gt;bullet&lt;/code&gt; that will store the reference to the Bullet Prefab Game Object. Then we have updated the &lt;code&gt;Update&lt;/code&gt; with more code to check if any input mapped to the button “Fire1” has been pressed down during this frame, if it has, then the script will instantiate a new Bullet Game Object in the Scene at the Player’s position (with no rotation). Select the Player Game Object in the Scene and update its properties in the Inspector window dragging the Bullet prefab to its Bullet property in the Player Component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xoczX7j2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/11-Unity_Editor_assign_bullet_to_player_bullet.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xoczX7j2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/11-Unity_Editor_assign_bullet_to_player_bullet.gif" alt="11-Unity_Editor_assign_bullet_to_player_bullet" width="560" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you are ready to fire!!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yAqSAna8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/12-Unity_Game_player_shooting_bullets.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yAqSAna8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://genomagames.com/genoma-invaders/assets/lesson-02/12-Unity_Game_player_shooting_bullets.gif" alt="12-Unity_Game_player_shooting_bullets" width="313" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Summing Up we have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a new custom Player Component made with C# to our Player Game Object&lt;/li&gt;
&lt;li&gt;Implement moving mechanics to the Player and Bullet Game Objects&lt;/li&gt;
&lt;li&gt;Handle Player Inputs to move and shoot Bullets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can get the code generated by following this tutorial in &lt;a href="https://github.com/GenomaGames/genoma-invaders/tree/tutorial/02"&gt;Genoma Invaders Github repository, branch &lt;code&gt;tutorial/02&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Remember to dig into documentation sites to have more context on what does what:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/index.html"&gt;Unity 2020.1 Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unity3d.com/2020.1/Documentation/ScriptReference/index.html"&gt;Unity 2020.1 Script Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/"&gt;Microsoft .NET C# Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Game Dev! 👾&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How To Install Unity 2020.1</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Wed, 01 Jul 2020 22:00:00 +0000</pubDate>
      <link>https://forem.com/genomagames/how-to-install-unity-2020-1-43ci</link>
      <guid>https://forem.com/genomagames/how-to-install-unity-2020-1-43ci</guid>
      <description>&lt;p&gt;In this article, you will &lt;strong&gt;learn how to install Unity 2020.1.0b13 (Beta)&lt;/strong&gt; using UnityHub 2.3.2 to &lt;strong&gt;start developing games&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; &lt;a href="https://blogs.unity3d.com/es/2020/07/23/unity-2020-1-is-now-available/"&gt;Unity 2020.1 is no longer in beta&lt;/a&gt; but you can still use this guide for stable releases&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;To install Unity, you will need first to install &lt;a href="https://unity3d.com/es/get-unity/download"&gt;UnityHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unity Installation
&lt;/h2&gt;

&lt;p&gt;Now to &lt;strong&gt;install Unity&lt;/strong&gt; start UnityHub and go to &lt;strong&gt;Installs&lt;/strong&gt; section and then click on the &lt;strong&gt;ADD&lt;/strong&gt; button. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ph9wOdBz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/00-UnityHub_2.3.2_Add_Install_Button.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ph9wOdBz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/00-UnityHub_2.3.2_Add_Install_Button.png" alt="00-UnityHub_2.3.2_Add_Install_Button" width="880" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then select the Unity version you would like to install, in this case &lt;strong&gt;Unity 2020.1.0b13 (Beta)&lt;/strong&gt; and click &lt;strong&gt;NEXT&lt;/strong&gt;. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SadPNP9R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/01-UnityHub_2.3.2_Install_Unity_Panel_with_Unity_2020.1.0b13_%28Beta%29_selected.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SadPNP9R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/01-UnityHub_2.3.2_Install_Unity_Panel_with_Unity_2020.1.0b13_%28Beta%29_selected.png" alt="01-UnityHub_2.3.2_Install_Unity_Panel_with_Unity_2020.1.0b13_(Beta)_selected" width="880" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the box of &lt;strong&gt;&lt;a href="https://visualstudio.microsoft.com/es/vs/"&gt;Microsoft Visual Studio Community 2019&lt;/a&gt;&lt;/strong&gt; to install it as it will be the &lt;a href="https://en.wikipedia.org/wiki/Integrated_development_environment"&gt;IDE&lt;/a&gt; you will be using for coding. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ZgqCI0b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/02-UnityHub_2.3.2_Install_Unity_2020.1.0b13_%28Beta%29_Panel_with_Microsoft_Visual_Studio_Community_2019_selected.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ZgqCI0b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/02-UnityHub_2.3.2_Install_Unity_2020.1.0b13_%28Beta%29_Panel_with_Microsoft_Visual_Studio_Community_2019_selected.png" alt="02-UnityHub_2.3.2_Install_Unity_2020.1.0b13_(Beta)_Panel_with_Microsoft_Visual_Studio_Community_2019_selected" width="880" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will have to agree to Microsoft Visual Studio Community 2019 License terms. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lgck6oz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/03-UnityHub_2.3.2_Install_Microsoft_Visual_Studio_Community_2019_Panel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lgck6oz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/03-UnityHub_2.3.2_Install_Microsoft_Visual_Studio_Community_2019_Panel.png" alt="03-UnityHub_2.3.2_Install_Microsoft_Visual_Studio_Community_2019_Panel" width="880" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, you will see a box with a loading bar meaning that the installation of Unity and Visual Studio is in progress. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EeoTe2J3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/04-UnityHub_2.3.2_Installs_Section_with_Unity_2020.1.0b13_%28Beta%29_being_installed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EeoTe2J3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://genomagames.com/assets/2020-07-02-how-to-install-unity-2020/04-UnityHub_2.3.2_Installs_Section_with_Unity_2020.1.0b13_%28Beta%29_being_installed.png" alt="04-UnityHub_2.3.2_Installs_Section_with_Unity_2020.1.0b13_(Beta)_being_installed" width="880" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the installation completes, you will be ready to open or start a new project with Unity 2020.&lt;/p&gt;

&lt;p&gt;Checkout &lt;a href="https://docs.unity3d.com/2020.1/Documentation/Manual/GettingStartedInstallingUnity.html"&gt;Unity 2020.1 Manual "Installing Unity" Chapter&lt;/a&gt; for more info&lt;/p&gt;

&lt;p&gt;Happy Game Dev! 👾&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Continuous Integration for Express APIs with Travis CI</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Wed, 20 Dec 2017 10:48:36 +0000</pubDate>
      <link>https://forem.com/albertofdzm/continuous-integration-for-express-apis-with-travis-ci-1ie7</link>
      <guid>https://forem.com/albertofdzm/continuous-integration-for-express-apis-with-travis-ci-1ie7</guid>
      <description>&lt;p&gt;This article covers &lt;strong&gt;how to use Travis CI service with NodeJS&lt;/strong&gt; for an open source project hosted on GitHub. At the end, you would be able to setup a basic build pipeline to automatically validate your code using &lt;strong&gt;Continuous Integration (CI)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is the &lt;strong&gt;6th post&lt;/strong&gt; of a series about &lt;strong&gt;Building APIs With Express&lt;/strong&gt;. The code of this post will be developed over the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/05"&gt;generated code&lt;/a&gt; of the last post (&lt;a href="http://onlythepixel.com/2017/09/06/testing-an-api-against-documentation/"&gt;&lt;strong&gt;Testing an API Against Documentation&lt;/strong&gt;&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Travis CI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://travis-ci.com/"&gt;Travis CI&lt;/a&gt; is one of the most used &lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt; services in the open source community. It's ridiculous how easy is to enable it for a GitHub project. To activate it first I need to &lt;a href="https://travis-ci.org/auth"&gt;have an account in travis-ci.org&lt;/a&gt; and give it access to GitHub projects, then in the &lt;a href="https://travis-ci.org/profile/"&gt;Travis CI profile page&lt;/a&gt; activate the service for the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AqbX_Oq---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/travis-ci-service-activation.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AqbX_Oq---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/travis-ci-service-activation.PNG" alt="Travis CI Service Activation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's all I need, thanks for the reading! Ah... ok, maybe there is needed something more...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vu-2uPGd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/travis-ci-no-builds.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vu-2uPGd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/travis-ci-no-builds.PNG" alt="Travis CI without builds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, to start building things with Travis I have to update the code. Once Travis &lt;strong&gt;detects some new branch or commits&lt;/strong&gt; on the repo it &lt;strong&gt;will run a build with that code&lt;/strong&gt; , but at this point, it will fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Travis CI for NodeJS
&lt;/h2&gt;

&lt;p&gt;Yes, there is a little thing to do before Travis starts working smoothly. It doesn't know what to do with that GitHub repository, to help in this, the repo has to have a &lt;strong&gt;config file (&lt;code&gt;.travis.yml&lt;/code&gt;) that tells Travis what to do with the code&lt;/strong&gt;. If it doesn't find this file it will try to build the project using Ruby.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;.travis.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_js&lt;/span&gt; &lt;span class="c1"&gt;# Sets which engine use to build the project  &lt;/span&gt;
&lt;span class="na"&gt;node_js&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt; &lt;span class="c1"&gt;# Specifies node version to use "node"="latest"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the simplest Travis CI config file for start building in NodeJS.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; More info about the configs on the &lt;a href="https://docs.travis-ci.com/user/languages/javascript-with-nodejs/"&gt;docs for Travis with JavaScript&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  First build
&lt;/h3&gt;

&lt;p&gt;After committing this file and uploading it to GitHub, Travis will start a new build, in this case with the next logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Worker information  
&lt;span class="nb"&gt;hostname&lt;/span&gt;: b4baa4ff-edbd-48aa-b09f-bc84b287b798@1.i-0a50124-production-2-worker-org-ec2.travisci.net  
version: v3.4.0 https://github.com/travis-ci/worker/tree/ce0440bc30c289a49a9b0c21e4e1e6f7d7825101  
instance: 7917cbf travisci/ci-garnet:packer-1503972846 &lt;span class="o"&gt;(&lt;/span&gt;via amqp&lt;span class="o"&gt;)&lt;/span&gt;  
startup: 571.280161ms  
Build system information  
Build language: node_js

...

MongoDB version  
MongoDB 3.2.16

...

&lt;span class="nv"&gt;$ &lt;/span&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nt"&gt;--branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;post/06 https://github.com/AlbertoFdzM/another-todo-api.git AlbertoFdzM/another-todo-api
Cloning into &lt;span class="s1"&gt;'AlbertoFdzM/another-todo-api'&lt;/span&gt;...  
remote: Counting objects: 124, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;  
remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;2/2&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;  
remote: Total 124 &lt;span class="o"&gt;(&lt;/span&gt;delta 0&lt;span class="o"&gt;)&lt;/span&gt;, reused 2 &lt;span class="o"&gt;(&lt;/span&gt;delta 0&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 121  
Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;124/124&lt;span class="o"&gt;)&lt;/span&gt;, 79.47 KiB | 15.89 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;  
Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;54/54&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;AlbertoFdzM/another-todo-api
&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout &lt;span class="nt"&gt;-qf&lt;/span&gt; dac5b5b13eef6d36ec76538c8194ce32923d628a
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./node_modules/.bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
Updating nvm  
&lt;span class="nv"&gt;$ &lt;/span&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;node
Downloading and installing node v9.1.0...  
Downloading https://nodejs.org/dist/v9.1.0/node-v9.1.0-linux-x64.tar.xz...  
&lt;span class="c"&gt;######################################################################## 100.0%&lt;/span&gt;
Computing checksum with &lt;span class="nb"&gt;sha256sum  
&lt;/span&gt;Checksums matched!  
Now using node v9.1.0 &lt;span class="o"&gt;(&lt;/span&gt;npm v5.5.1&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
v9.1.0  
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nt"&gt;--version&lt;/span&gt;
5.5.1  
&lt;span class="nv"&gt;$ &lt;/span&gt;nvm &lt;span class="nt"&gt;--version&lt;/span&gt;
0.33.6  
&lt;span class="nv"&gt;$ &lt;/span&gt;yarn
yarn &lt;span class="nb"&gt;install &lt;/span&gt;v0.27.5  
&lt;span class="o"&gt;[&lt;/span&gt;1/4] Resolving packages...
&lt;span class="o"&gt;[&lt;/span&gt;2/4] Fetching packages...
&lt;span class="o"&gt;[&lt;/span&gt;3/4] Linking dependencies...
&lt;span class="o"&gt;[&lt;/span&gt;4/4] Building fresh packages...
Done &lt;span class="k"&gt;in &lt;/span&gt;131.09s.

&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; another-todo-api@0.0.0 &lt;span class="nb"&gt;test&lt;/span&gt; /home/travis/build/AlbertoFdzM/another-todo-api
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; dredd

info: Configuration &lt;span class="s1"&gt;'./dredd.yml'&lt;/span&gt; found, ignoring other arguments.  
warn: Apiary API Key or API Project Subdomain were not provided. Configure Dredd to be able to save &lt;span class="nb"&gt;test &lt;/span&gt;reports alongside your Apiary API project: https://dredd.readthedocs.io/en/latest/how-to-guides/#using-apiary-reporter-and-apiary-tests  
info: Starting backend server process with &lt;span class="nb"&gt;command&lt;/span&gt;: npm start  
info: Waiting 3 seconds &lt;span class="k"&gt;for &lt;/span&gt;backend server process to start

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; another-todo-api@0.0.0 start /home/travis/build/AlbertoFdzM/another-todo-api
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;another-todo:&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; node bin/www

&lt;span class="o"&gt;(&lt;/span&gt;node:4653&lt;span class="o"&gt;)&lt;/span&gt; UnhandledPromiseRejectionWarning: Unhandled promise rejection &lt;span class="o"&gt;(&lt;/span&gt;rejection &lt;span class="nb"&gt;id&lt;/span&gt;: 1&lt;span class="o"&gt;)&lt;/span&gt;: MongoError: failed to connect to server &lt;span class="o"&gt;[&lt;/span&gt;localhost:27017] on first connect &lt;span class="o"&gt;[&lt;/span&gt;MongoError: connect ECONNREFUSED 127.0.0.1:27017]
info: Beginning Dredd testing...  
info: Found Hookfiles: &lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/travis/build/AlbertoFdzM/another-todo-api/docs/hooks.js  
error: GET &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks duration: 120101ms  
error: Error connecting to server under &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;  
GET /v1/tasks - - ms - -  
error: POST &lt;span class="o"&gt;(&lt;/span&gt;201&lt;span class="o"&gt;)&lt;/span&gt; /tasks duration: 120105ms  
error: Error connecting to server under &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;  
error: GET &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks/586e88337106b038d820a54f duration: NaNms  
error: TypeError: Cannot &lt;span class="nb"&gt;read &lt;/span&gt;property &lt;span class="s1"&gt;'body'&lt;/span&gt; of undefined  
    at replaceUrlForCreatedTaskId &lt;span class="o"&gt;(&lt;/span&gt;/home/travis/build/AlbertoFdzM/another-todo-api/docs/hooks.js:10:89&lt;span class="o"&gt;)&lt;/span&gt;

...

&lt;span class="nb"&gt;complete&lt;/span&gt;: 0 passing, 0 failing, 10 errors, 0 skipped, 6 total  
&lt;span class="nb"&gt;complete&lt;/span&gt;: Tests took 720719ms  
&lt;span class="nb"&gt;complete&lt;/span&gt;: See results &lt;span class="k"&gt;in &lt;/span&gt;Apiary at: https://app.apiary.io/public/tests/run/91a01c82-f849-4736-8681-469d8e4d7ba9  
info: Backend server process exited  
npm ERR! Test failed. See above &lt;span class="k"&gt;for &lt;/span&gt;more details.  
The &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="s2"&gt;"npm test"&lt;/span&gt; exited with 1.  
Done. Your build exited with 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some logs traces have been omitted to improve readability. The whole log can be found in the &lt;a href="https://travis-ci.org/AlbertoFdzM/another-todo-api/builds/302110299"&gt;Travis CI build report&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What has happened?
&lt;/h3&gt;

&lt;p&gt;There are some good things and some bad thing to pay attention to. The first one is that Travis has made a build with NodeJS! It gives a lot of info about what is happening in that machine that is building the project in "the cloud" (OS version, node version, npm version, what things are installed in the system..)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repo: &lt;code&gt;git clone --depth=50 --branch=post/06 https://github.com/AlbertoFdzM/another-todo-api.git AlbertoFdzM/another-todo-api&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install NodeJS: &lt;code&gt;nvm install node&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install project dependencies: &lt;code&gt;yarn&lt;/code&gt; (it detects that we have a &lt;code&gt;yarn.lock&lt;/code&gt; file in the project) &lt;/li&gt;
&lt;li&gt;Execute the tests: &lt;code&gt;npm test&lt;/code&gt; ( &lt;strong&gt;default build command for Travis on NodeJS&lt;/strong&gt; ) &lt;/li&gt;
&lt;li&gt;The tests fail: &lt;code&gt;npm ERR! Test failed. See above for more details.&lt;/code&gt; 😢 &lt;/li&gt;
&lt;li&gt;The build fails: &lt;code&gt;Done. Your build exited with 1.&lt;/code&gt; (hint: 1 is bad, 0 is good)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;node:4653&lt;span class="o"&gt;)&lt;/span&gt; UnhandledPromiseRejectionWarning: Unhandled promise rejection &lt;span class="o"&gt;(&lt;/span&gt;rejection &lt;span class="nb"&gt;id&lt;/span&gt;: 1&lt;span class="o"&gt;)&lt;/span&gt;: MongoError: failed to connect to server &lt;span class="o"&gt;[&lt;/span&gt;localhost:27017] on first connect &lt;span class="o"&gt;[&lt;/span&gt;MongoError: connect ECONNREFUSED 127.0.0.1:27017]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It hasn't connected to the MongoDB database even though MongoDB was installed in the system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;MongoDB version  
MongoDB 3.2.16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is because &lt;a href="https://docs.travis-ci.com/user/database-setup/"&gt;Travis doesn't start the service unless you tell it to do so&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's fix it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;.travis.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_js&lt;/span&gt;  
&lt;span class="na"&gt;node_js&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;  
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit, push, &lt;a href="https://travis-ci.org/AlbertoFdzM/another-todo-api/builds/302132559"&gt;check the build&lt;/a&gt; and... 🎉 &lt;code&gt;Done. Your build exited with 0.&lt;/code&gt; (reminder: 0 is good)&lt;/p&gt;

&lt;p&gt;Stop the machines, we can go home finally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait... This post for a file with 3 lines only?
&lt;/h2&gt;

&lt;p&gt;Yep, but there was already some things done, like well-defined dependencies in the &lt;code&gt;package.json&lt;/code&gt; and tests defined using NodeJS standard practices with &lt;code&gt;npm test&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Want more? Ok, there is more to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Travis CI Caching
&lt;/h3&gt;

&lt;p&gt;The Travis config file can define which folders should be cached to improve build time. In this case, I'm going to cache the &lt;code&gt;node_modules&lt;/code&gt; folder to reduce the time installing dependencies and also for &lt;code&gt;yarn&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;.travis.yml&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_js&lt;/span&gt;  
&lt;span class="na"&gt;node_js&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;  
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb&lt;/span&gt;  
&lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
  &lt;span class="na"&gt;directories&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node_modules"&lt;/span&gt;
  &lt;span class="na"&gt;yarn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; More info in &lt;a href="https://docs.travis-ci.com/user/caching"&gt;Travis CI Caching documentation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Travis Build Over Multiple NodeJS Versions
&lt;/h3&gt;

&lt;p&gt;Travis CI can be configured to run against multiple NodeJS versions every time it builds to ensure the project works correctly in this environments.&lt;/p&gt;

&lt;p&gt;For this project, it will run builds for the "latest" version, for NodeJS v4.x and NodeJS v7.x.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;.travis.yml&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_js&lt;/span&gt;  
&lt;span class="na"&gt;node_js&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb&lt;/span&gt;  
&lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
  &lt;span class="na"&gt;directories&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node_modules"&lt;/span&gt;
  &lt;span class="na"&gt;yarn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  THE Travis Status Badge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://travis-ci.org/AlbertoFdzM/another-todo-api"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JR1Dpb1P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://travis-ci.org/AlbertoFdzM/another-todo-api.svg%3Fbranch%3Dmaster" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the only very thing why all of us integrate our projects with Travis. To be the fanciest on GitHub wearing a bunch of blue/green badges saying that everything is ok and all is up to date.&lt;/p&gt;

&lt;p&gt;To get the code click on the badge from the Travis CI page of the project, a dialog will appear showing you different options about which branch and in what kind of code you want the image snippet.&lt;/p&gt;

&lt;p&gt;That image will show the updated build status of the selected branch.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;README.md&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Another boring TODO API&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;![Build Status&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://travis-ci.org/AlbertoFdzM/another-todo-api.svg?branch=master&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;](https://travis-ci.org/AlbertoFdzM/another-todo-api)

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub Code Supervision with Travis CI
&lt;/h3&gt;

&lt;p&gt;Another cool thing Travis can do is to check every bit of code that changes in the project and avoid breaking changes to be merged into critical branches as well as notify about commits breaking the build.&lt;/p&gt;

&lt;p&gt;Checking the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/commits/post/06"&gt;commits history&lt;/a&gt; with Travis integrated, there appears checks and crosses indicating if the build executed for that commit went ok, and by clicking them you can go to the Travis build logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ee2KKOsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/github-commits-with-travis-status.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ee2KKOsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/github-commits-with-travis-status.PNG" alt="GitHub Commits With Travis CI Status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To avoid direct commits against a branch in GitHub and instead add code to it by Pull Requests you can activate the Branch Protection under the Project Settings inside the Branches section. Once there select the branch to protect and check "Protect this branch", "Require status checks to pass before merging", "Require branches to be up to date before merging", "continuous-integration/travis-ci" and "Include administrators".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sPKmgevC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/github-branch-protection.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sPKmgevC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/github-branch-protection.PNG" alt="GitHub Branch Protection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By this way, all the code to be modified in that branch has to pass through a PR and then complete a successful build with Travis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_JXKAdjw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/travis-ci-pr-check.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_JXKAdjw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/11/travis-ci-pr-check.PNG" alt="Travis CI PR Check"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Travis CI is perfect to ensure the sanity of your code and to maintain good practices against the project, it also helps to detect possible bugs caused by refactors or changes in the functionality of the project. But that's not all, with advanced builds you could make deploys to production servers or build a compiled version for the end-user.&lt;/p&gt;

&lt;p&gt;As always, the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/06"&gt;generated code from this article is on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>api</category>
      <category>express</category>
      <category>travisci</category>
    </item>
    <item>
      <title>Clean Google Analytics Metrics</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Mon, 27 Nov 2017 11:39:02 +0000</pubDate>
      <link>https://forem.com/albertofdzm/clean-google-analytics-metrics-ej6</link>
      <guid>https://forem.com/albertofdzm/clean-google-analytics-metrics-ej6</guid>
      <description>&lt;p&gt;So here is what happened. I went to my analytics panel and I checked my monthly visits. What did I saw?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gEPi9XFf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Monthly_Analytics.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gEPi9XFf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Monthly_Analytics.PNG" alt="Monthly Google Analytics Graph"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That peak annoyed me, so I decided to investigate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find Analytics Anomaly with Filters
&lt;/h2&gt;

&lt;p&gt;What I do to &lt;strong&gt;identify why I have that peak in analytics&lt;/strong&gt; is by trying to isolate it using analytics dynamic filters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Filter by Date
&lt;/h3&gt;

&lt;p&gt;First by isolating the date. If this is not the case there are more ways to isolate it that I will expose later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZZQ9Nnd3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/One_Day_Analytics_Graph.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZZQ9Nnd3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/One_Day_Analytics_Graph.PNG" alt="One Day Analytics Graph"&gt;&lt;/a&gt;&lt;em&gt;There you are little bastard&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this case, it seems like the anomaly has happened in a very particular moment of the day like someone was doing a lot of requests to the web in a small fraction of the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Filter by City or Country
&lt;/h3&gt;

&lt;p&gt;Now looking at the table of metrics filtered by City there is a particular one with a lot of requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RUul6FEz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/City_Filtered_Analytics_Table.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RUul6FEz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/City_Filtered_Analytics_Table.PNG" alt="City Filtered Analytics Table"&gt;&lt;/a&gt;&lt;em&gt;Zaporozhye, Ukraine&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That could be a great follower of my blog but I will be a little reluctant and investigate a little more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Filter by Network
&lt;/h3&gt;

&lt;p&gt;Just to ensure that these Ukrainian visits are reliable I'm going to look at the Network section on the left panel under Audience and then Technology.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j53_Qmd4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Service_Provider_Filtered_Analytics_Table.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j53_Qmd4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Service_Provider_Filtered_Analytics_Table.PNG" alt="Service Provider Filtered Analytics Table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at the table it seems that my Ukrainian visits are being provided by &lt;code&gt;ovh hosting inc.&lt;/code&gt; which is strange because that is my actual hosting provider. And looking at the bounce rate for those visits that is 100% it will mess the metrics changing the real user bounce rate.&lt;/p&gt;

&lt;p&gt;To ensure that this is my machine I check the Hostname dimension (the link is on top of the table).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZTf86DZ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Hostname_Filtered_Analytics_Table.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZTf86DZ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Hostname_Filtered_Analytics_Table.PNG" alt="Hostname Filtered Analytics Table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There only appears my hostname. Sometimes these anomalies are caused by spam bots or crawlers and you could identify them in this view. This time seems that the problem is coming from my hosting provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filtering Analytics to get Clean Metrics
&lt;/h2&gt;

&lt;p&gt;So now that I've recap a lot of info about what is going on with the metrics I can create some filters to ensure that my metrics are clean next time I check them.&lt;/p&gt;

&lt;p&gt;First thing is to create a "Master" view that is going to have all the filters avoiding spam traffic and annoying stuff and I would leave the original view renamed to "Unfiltered" to compare its traffic time to time with "Master".&lt;/p&gt;

&lt;p&gt;The way to create views is in the Admin section with the property selected by clicking on the &lt;code&gt;VIEW&lt;/code&gt; select box and then on "Create New View". Once it is created the filters could be applied by clicking on the Filters section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3qVfDjq0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Analytics_Admin_Panel.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3qVfDjq0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Analytics_Admin_Panel.PNG" alt="Analytics Admin Panel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Filters in Google Analytics
&lt;/h3&gt;

&lt;p&gt;Google Analytics offers tons of ways to filter our metrics, not only to clean them but also to have a custom type of views that could be used for different purposes.&lt;/p&gt;

&lt;p&gt;The first filter I'm going to need is to exclude all the traffic that could come from unknown hostnames.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lj6Q45Au--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Creating_Google_Analytics_Filter.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lj6Q45Au--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Creating_Google_Analytics_Filter.PNG" alt="Filtering Including Hostname"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then a filter for my annoying Hosting provider.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Js_vyuxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Creating_Google_Analytics_Filter_For_ISP.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Js_vyuxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Creating_Google_Analytics_Filter_For_ISP.PNG" alt="Filtering Excluding Hostname"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally to ensure that Crawlers doesn't pollute my metrics, one for them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FvRVKbZx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Creating_Google_Analytics_Filter_For_Crawlers.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FvRVKbZx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Creating_Google_Analytics_Filter_For_Crawlers.PNG" alt="Filtering Excluding Crawlers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you have the expression I used for the crawlers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;site-auditor\.online|speedup-my\.site|website-analytics\.online
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can detect them under the Acquisition section on Referrals.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Filters doesn't clean info of your metrics from the past, so they will start working from the moment you apply them.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it clean!
&lt;/h2&gt;

&lt;p&gt;That's all, now on it's up to you to improve it. You can read more on &lt;a href="https://support.google.com/analytics/topic/1032939"&gt;Google Analytics Filter Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>google</category>
      <category>analytics</category>
      <category>tracking</category>
    </item>
    <item>
      <title>Testing an API Against its Documentation</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Thu, 23 Nov 2017 11:18:08 +0000</pubDate>
      <link>https://forem.com/albertofdzm/testing-an-api-against-documentation-6cl</link>
      <guid>https://forem.com/albertofdzm/testing-an-api-against-documentation-6cl</guid>
      <description>&lt;p&gt;This article covers how to run tests based on the API docs against an Express NodeJS API documented with API Blueprint using Dredd testing tool.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is the &lt;strong&gt;5th post&lt;/strong&gt; of a series of post about &lt;strong&gt;Building APIs With Express&lt;/strong&gt;. Based on my last post about &lt;a href="https://dev.to/albertofdzm/documenting-your-api-with-api-blueprint-e0m"&gt;&lt;strong&gt;Documenting your API with API Blueprint&lt;/strong&gt;&lt;/a&gt; I'll continue developing over the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/04"&gt;generated code&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So last time I documented the Another TODO API using &lt;a href="https://apiblueprint.org/"&gt;API Blueprint&lt;/a&gt; and now I'm going to take advantage of that to have some &lt;strong&gt;test against the API to ensure documentation is up to date with the actual API code&lt;/strong&gt;. For this task, I'm going to be using &lt;a href="https://github.com/apiaryio/dredd"&gt;Dredd&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dredd
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4HkJV08U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/dredd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4HkJV08U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/dredd.png" alt="Dredd Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dredd is a tool for testing APIs using their own documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Dredd Locally
&lt;/h3&gt;

&lt;p&gt;To install Dredd for this use case it is needed to have installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/"&gt;NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://npmjs.com"&gt;NPM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then on the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; dredd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Dredd can be used as CLI tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Dredd
&lt;/h3&gt;

&lt;p&gt;These Dredd guys are amazing to the point that the only thing needed to be done to start working with Dredd is by running the next line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dredd init

? Location of the API description document docs/main.apib
? Command to start API backend server e.g. &lt;span class="o"&gt;(&lt;/span&gt;bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rails server&lt;span class="o"&gt;)&lt;/span&gt; npm start
? URL of tested API endpoint http://127.0.0.1:3000/v1
? Programming language of hooks nodejs
? Do you want to use Apiary &lt;span class="nb"&gt;test &lt;/span&gt;inspector? Yes
? Please enter Apiary API key or leave empty &lt;span class="k"&gt;for &lt;/span&gt;anonymous reporter
? Dredd is best served with Continuous Integration. Create CircleCI config &lt;span class="k"&gt;for &lt;/span&gt;Dredd? No

Configuration saved to dredd.yml

Run &lt;span class="nb"&gt;test &lt;/span&gt;now, with:

  &lt;span class="nv"&gt;$ &lt;/span&gt;dredd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some notes about what has been done here. Dredd has created a &lt;code&gt;dredd.yml&lt;/code&gt; file at the root of the project with a bunch of properties based on the replies it has received.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;dredd.yml&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# https://dredd.readthedocs.io/en/latest/usage-cli.html#configuration-file&lt;/span&gt;
&lt;span class="na"&gt;dry-run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;null&lt;/span&gt;  
&lt;span class="na"&gt;hookfiles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;null&lt;/span&gt;  
&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nodejs&lt;/span&gt;  
&lt;span class="na"&gt;sandbox&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm start&lt;/span&gt; &lt;span class="c1"&gt;# Command to start the API server  &lt;/span&gt;
&lt;span class="na"&gt;server-wait&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3&lt;/span&gt;  
&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;custom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
  &lt;span class="na"&gt;apiaryApiKey&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
&lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;  
&lt;span class="na"&gt;reporter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apiary&lt;/span&gt;  
&lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;  
&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;  
&lt;span class="na"&gt;sorted&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;null&lt;/span&gt;  
&lt;span class="na"&gt;inline-errors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;  
&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;  
&lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;info&lt;/span&gt;  
&lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;silent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5000&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-connect-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1500&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-connect-retry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;500&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-after-connect-wait&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;100&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-term-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5000&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-term-retry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;500&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-handler-host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1&lt;/span&gt;  
&lt;span class="na"&gt;hooks-worker-handler-port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;61321&lt;/span&gt;  
&lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./dredd.yml&lt;/span&gt; &lt;span class="c1"&gt;# Source of Dredd config file  &lt;/span&gt;
&lt;span class="na"&gt;blueprint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docs/main.apib&lt;/span&gt; &lt;span class="c1"&gt;# The API Blueprint file to get API definitions  &lt;/span&gt;
&lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000/v1'&lt;/span&gt; &lt;span class="c1"&gt;# The base URL where the test will run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've commented the lines that I found most important for this step but all the info can be found in &lt;a href="https://dredd.readthedocs.io/en/latest/usage-cli.html#configuration-file"&gt;Dredd Configuration File Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running Tests with Dredd
&lt;/h3&gt;

&lt;p&gt;Now that the project has a config file and Dredd knows how to run the server this is the next command to execute (I think you already know):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dredd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When executing the tests there will appear a report about what Dredd has found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;info: Configuration &lt;span class="s1"&gt;'./dredd.yml'&lt;/span&gt; found, ignoring other arguments.  
warn: Apiary API Key or API Project Subdomain were not provided. Configure Dredd to be able to save &lt;span class="nb"&gt;test &lt;/span&gt;reports alongside your Apiary API project: https://dredd.readthedocs.io/en/latest/how-to-guides/#using-apiary-reporter-and-apiary-tests  
info: Starting backend server process with &lt;span class="nb"&gt;command&lt;/span&gt;: npm start  
info: Waiting 3 seconds &lt;span class="k"&gt;for &lt;/span&gt;backend server process to start

...

info: Beginning Dredd testing...  
GET /v1/tasks 200 13.427 ms - 1450  
fail: GET &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks duration: 58ms

...

info: Displaying failed tests...  
fail: GET &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks duration: 58ms  
fail: headers: Header &lt;span class="s1"&gt;'content-type'&lt;/span&gt; has value &lt;span class="s1"&gt;'application/json; charset=utf-8'&lt;/span&gt; instead of &lt;span class="s1"&gt;'application/json'&lt;/span&gt;

request:  
method: GET  
uri: /tasks  
headers:  
    User-Agent: Dredd/4.4.0 &lt;span class="o"&gt;(&lt;/span&gt;Windows_NT 10.0.15063&lt;span class="p"&gt;;&lt;/span&gt; x64&lt;span class="o"&gt;)&lt;/span&gt;
    Content-Length: 0

body:

expected:  
headers:  
    Content-Type: application/json

body:  
&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:37.066Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:37.066Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e88217106b038d820a54e"&lt;/span&gt;,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  ...
&lt;span class="o"&gt;]&lt;/span&gt;
statusCode: 200

actual:  
statusCode: 200  
headers:  
    x-powered-by: Express
    content-type: application/json&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf-8
    content-length: 1450
    etag: W/&lt;span class="s2"&gt;"5aa-Oh/N4fD/Is1M3QO9MzB/QQaYxDU"&lt;/span&gt;
    &lt;span class="nb"&gt;date&lt;/span&gt;: Fri, 01 Sep 2017 15:36:43 GMT
    connection: close

body:  
&lt;span class="o"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"_id"&lt;/span&gt;:&lt;span class="s2"&gt;"59a2fe039c2adf0e90acca12"&lt;/span&gt;,&lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;:&lt;span class="s2"&gt;"2017-08-27T17:14:43.564Z"&lt;/span&gt;,&lt;span class="s2"&gt;"createdAt"&lt;/span&gt;:&lt;span class="s2"&gt;"2017-08-27T17:14:43.564Z"&lt;/span&gt;,&lt;span class="s2"&gt;"__v"&lt;/span&gt;:0,&lt;span class="s2"&gt;"isDone"&lt;/span&gt;:false,&lt;span class="s2"&gt;"description"&lt;/span&gt;:&lt;span class="s2"&gt;"Buy milk"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"_id"&lt;/span&gt;:&lt;span class="s2"&gt;"59a2fe0f852c331148011df3"&lt;/span&gt;,&lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;:&lt;span class="s2"&gt;"2017-0
8-27T17:14:55.731Z"&lt;/span&gt;,...  
&lt;span class="o"&gt;}]&lt;/span&gt;

...

&lt;span class="nb"&gt;complete&lt;/span&gt;: 0 passing, 6 failing, 0 errors, 0 skipped, 6 total  
&lt;span class="nb"&gt;complete&lt;/span&gt;: Tests took 815ms  
DELETE /v1/tasks/586e88337106b038d820a54f 404 1.128 ms - 539  
&lt;span class="nb"&gt;complete&lt;/span&gt;: See results &lt;span class="k"&gt;in &lt;/span&gt;Apiary at: https://app.apiary.io/public/tests/run/423b37ad-1dd8-499c-9124-4320ea0f7911  
info: Backend server process exited
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, at the end, if the dredd config file has the &lt;code&gt;reporter&lt;/code&gt; as &lt;code&gt;apiary&lt;/code&gt;, there will be a link (similar to &lt;code&gt;https://app.apiary.io/public/tests/run/123456&lt;/code&gt;) to this page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bzHSeSHn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Apiary_Dredd_Test.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bzHSeSHn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Apiary_Dredd_Test.PNG" alt="Apiary Dredd Test"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; The provided link is a temporary page and will be removed after a while.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this panel is a lot of info about how the tests did go. Another TODO API has some errors in the docs, one of them is the definition of &lt;code&gt;content-type&lt;/code&gt;. &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/commit/0e4663f45b0e064b6cd8573acda77d6d4b1f270b"&gt;Let's fix that&lt;/a&gt; and run the tests again.&lt;/p&gt;

&lt;p&gt;After the changes and running &lt;code&gt;dredd&lt;/code&gt; this is the new report:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xfrN572P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Apiary_Dredd_Test_1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xfrN572P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/08/Apiary_Dredd_Test_1.PNG" alt="Apiary Dredd Test"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This time some of the endpoints have been validated but not all. The &lt;strong&gt;endpoints that require a task ID to work are returning &lt;code&gt;404&lt;/code&gt; responses and causing the test to fail&lt;/strong&gt;. this is because the task IDs specified in the API docs are only exposed as an example and doesn't really exists in the DB. Here is when &lt;a href="https://dredd.readthedocs.io/en/latest/hooks-nodejs.html"&gt;Dredd hooks&lt;/a&gt; come handy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dredd Hooks
&lt;/h3&gt;

&lt;p&gt;The hooks allow executing some code between, before or after each test case. This time I'm going to use one hook to get the ID of the task created on the "Create a New Task" definition to use that created task for the tests that need a &lt;em&gt;taskId&lt;/em&gt; to work.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;docs/hooks.js&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Import the hooks library to work with them (injected by dredd)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;// Create some shorthand functions for the hooks&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;after&lt;/span&gt;  
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;before&lt;/span&gt;

&lt;span class="c1"&gt;// Because the action is going to be the same in all the hooks lets create a function&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;replaceUrlForCreatedTaskId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="c1"&gt;// Gets the taskId from the response object&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;taskId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;responseStash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tasks &amp;gt; Tasks Collection &amp;gt; Create a New Task&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;_id&lt;/span&gt;
  &lt;span class="c1"&gt;// Gets the predefined request url&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;

  &lt;span class="c1"&gt;// Replaces the wrong taskId with the correct one&lt;/span&gt;
  &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;586e88337106b038d820a54f&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;taskId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Instantiates an object to store the responses&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;responseStash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Sets a hook to be executed after creating a task to store the response&lt;/span&gt;
&lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tasks &amp;gt; Tasks Collection &amp;gt; Create a New Task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="c1"&gt;// Stores the response inside the temporary object&lt;/span&gt;
  &lt;span class="nx"&gt;responseStash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;real&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Sets hooks before the requests are made to replace the URLs&lt;/span&gt;
&lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tasks &amp;gt; Task &amp;gt; View a Task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replaceUrlForCreatedTaskId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tasks &amp;gt; Task &amp;gt; Edit a whole Task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replaceUrlForCreatedTaskId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tasks &amp;gt; Task &amp;gt; Edit a Task partially&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replaceUrlForCreatedTaskId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tasks &amp;gt; Task &amp;gt; Delete a Task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replaceUrlForCreatedTaskId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After setting the hooks the &lt;code&gt;dredd.yml&lt;/code&gt; file needs to be modified.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;dredd.yml&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# https://dredd.readthedocs.io/en/latest/usage-cli.html#configuration-file&lt;/span&gt;
&lt;span class="na"&gt;dry-run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;null&lt;/span&gt;  
&lt;span class="na"&gt;hookfiles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./docs/hooks.js&lt;/span&gt; &lt;span class="c1"&gt;# Here, we are telling dredd where are the hooks files  &lt;/span&gt;
&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nodejs&lt;/span&gt;  
&lt;span class="na"&gt;sandbox&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;  
&lt;span class="nn"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now running the tests again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;info: Displaying failed tests...  
fail: PATCH &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks/586e88337106b038d820a54f duration: 11ms  
fail: body: Can&lt;span class="s1"&gt;'t validate. Expected body Content-Type is application/json; charset=utf-8 but body is not a parseable JSON: Parse error on line 1:  
+ Attributes (Task)
^
Expecting '&lt;/span&gt;STRING&lt;span class="s1"&gt;', '&lt;/span&gt;NUMBER&lt;span class="s1"&gt;', '&lt;/span&gt;NULL&lt;span class="s1"&gt;', '&lt;/span&gt;TRUE&lt;span class="s1"&gt;', '&lt;/span&gt;FALSE&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;', got '&lt;/span&gt;undefined&lt;span class="s1"&gt;'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is complaining about the line 118 of the &lt;code&gt;main.apib&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;+&lt;/span&gt; Response 200 (application/json; charset=utf-8)&lt;span class="sb"&gt;

        + Attributes (Task)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is being used a &lt;em&gt;data structure&lt;/em&gt; for the response field but it's indented by 8 spaces , and for API Blueprint documents that means a block of code, so by &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/commit/dd6a4b1f0f61aa18a98bbc27f907cc39e8ad5b9d"&gt;reducing it to 4&lt;/a&gt; and running the tests again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;info: Beginning Dredd testing...  
info: Found Hookfiles: &lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;E:&lt;span class="se"&gt;\d&lt;/span&gt;evelop&lt;span class="se"&gt;\a&lt;/span&gt;nother-todo-api&lt;span class="se"&gt;\d&lt;/span&gt;ocs&lt;span class="se"&gt;\h&lt;/span&gt;ooks.js  
GET /v1/tasks 200 14.604 ms - 5636  
pass: GET &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks duration: 69ms  
POST /v1/tasks 201 26.640 ms - 160  
pass: POST &lt;span class="o"&gt;(&lt;/span&gt;201&lt;span class="o"&gt;)&lt;/span&gt; /tasks duration: 48ms  
GET /v1/tasks/59a9a413bfa907076857eae2 200 4.018 ms - 160  
pass: GET &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks/586e88337106b038d820a54f duration: 110ms  
PUT /v1/tasks/59a9a413bfa907076857eae2 200 7.289 ms - 159  
pass: PUT &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks/586e88337106b038d820a54f duration: 21ms  
pass: PATCH &lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt; /tasks/586e88337106b038d820a54f duration: 15ms  
PATCH /v1/tasks/59a9a413bfa907076857eae2 200 2.659 ms - 164  
pass: DELETE &lt;span class="o"&gt;(&lt;/span&gt;204&lt;span class="o"&gt;)&lt;/span&gt; /tasks/586e88337106b038d820a54f duration: 30ms  
&lt;span class="nb"&gt;complete&lt;/span&gt;: 6 passing, 0 failing, 0 errors, 0 skipped, 6 total  
&lt;span class="nb"&gt;complete&lt;/span&gt;: Tests took 579ms  
DELETE /v1/tasks/59a9a413bfa907076857eae2 204 3.519 ms - -  
&lt;span class="nb"&gt;complete&lt;/span&gt;: See results &lt;span class="k"&gt;in &lt;/span&gt;Apiary at: https://app.apiary.io/public/tests/run/ca648983-2438-4b7b-b720-352bc00a79c8  
info: Backend server process exited
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Smooth like butter&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GGI6rq3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/09/Apiary_Dredd_Test_OK.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GGI6rq3G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://onlythepixel.com/content/images/2017/09/Apiary_Dredd_Test_OK.PNG" alt="Clean Dredd Test Report"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  NPM Test Script
&lt;/h3&gt;

&lt;p&gt;Until now I've been using Dredd from my global installation but it's a better idea to include it as a dev dependency and create an npm test script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-D&lt;/span&gt; dredd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;package.json&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint **/*.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set DEBUG=another-todo:* &amp;amp;&amp;amp; node bin/www"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dredd"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Dredd is a good tool to &lt;strong&gt;maintain your API Doc updated and make &lt;a href="https://gist.github.com/zsup/9434452"&gt;DDD (Documentation Driven Development)&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, you can check the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/05"&gt;generated code on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding &amp;lt;3!&lt;/p&gt;

</description>
      <category>api</category>
      <category>apiary</category>
      <category>node</category>
      <category>dredd</category>
    </item>
    <item>
      <title>Documenting your API with API Blueprint</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Mon, 20 Nov 2017 10:43:17 +0000</pubDate>
      <link>https://forem.com/albertofdzm/documenting-your-api-with-api-blueprint-e0m</link>
      <guid>https://forem.com/albertofdzm/documenting-your-api-with-api-blueprint-e0m</guid>
      <description>&lt;p&gt;This article covers &lt;strong&gt;how to document an API REST using API Blueprint&lt;/strong&gt; standard providing API usage info to future clients. It can also be helpful to design the structure of future API endpoints before start its development.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is the 4th post of a series of post about &lt;strong&gt;Building APIs With Express&lt;/strong&gt;. Based on my last post about &lt;a href="http://onlythepixel.com/2017/01/05/mongoose-mongodb-and-express/"&gt;&lt;strong&gt;Mongoose, MongoDB and Express&lt;/strong&gt;&lt;/a&gt; I'll continue developing over the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/03"&gt;generated code&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OMG, a lot of time has passed since my last commit and now when I look at the API there are some endpoints that I don't remember very well since the last time I developed them. Let's fix it now that I understand most of it by &lt;strong&gt;documenting the API using &lt;a href="https://apiblueprint.org/"&gt;API Blueprint syntax&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;API Blueprint is a very basic standard based on &lt;strong&gt;&lt;a href="https://apiblueprint.org/documentation/mson/tutorial.html"&gt;MSON (Markdown Syntax for Object Notation)&lt;/a&gt;&lt;/strong&gt; and due to its relative simplicity to write it could be easily maintainable along the life of an API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documenting right
&lt;/h2&gt;

&lt;p&gt;I'm going to create a new folder in my project called &lt;code&gt;docs&lt;/code&gt; to store all the documentation about my TODO API, and "&lt;em&gt;why is this? in the same repo as your code?&lt;/em&gt;" may you ask, well this is because I think &lt;strong&gt;the docs files should be as close as possible to your code&lt;/strong&gt; to ensure that they are updated and maintained by whom is developing the API. Also because I could use them to &lt;strong&gt;test the API against the documentation&lt;/strong&gt; using some nice tools.&lt;/p&gt;

&lt;p&gt;Let's stop chattering and start coding!&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining the API
&lt;/h2&gt;

&lt;p&gt;First I'm going to define the API main info:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/docs/main.md&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FORMAT: 1A

# Another TODO

Another TODO API is that, another TODO API.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the first line, I'm setting the format (1A) used for the document, the name for my API and a small description. That was easy, time to define the API resources after the API general description.&lt;/p&gt;

&lt;h4&gt;
  
  
  API Resources
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FORMAT: 1A

...

# Group Tasks

Resources related to the tasks in the API.

## Tasks Collection [/tasks]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Mind the ellipsis &lt;code&gt;...&lt;/code&gt; as obviate code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now here are a couple of &lt;strong&gt;keywords that will define our API schema&lt;/strong&gt;, the first one is &lt;code&gt;Group&lt;/code&gt; that is defining a section to categorize some resource and the other one is the &lt;code&gt;[/tasks]&lt;/code&gt; definition at the end of the second header that is defining an endpoint. Now the actions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Actions
&lt;/h4&gt;



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

### List All Tasks [GET]

+ Response 200 (application/json)

        [
          {
            "__v": 0,
            "updatedAt": "2017-04-09T16:15:37.066Z",
            "createdAt": "2017-04-09T16:15:37.066Z",
            "_id": "586e88217106b038d820a54e",
            "isDone": false,
            "description": "test"
          },
          {
            "__v": 0,
            "updatedAt": "2017-04-09T16:15:37.067Z",
            "createdAt": "2017-04-09T16:15:37.067Z",
            "_id": "586e88337106b038d820a54f",
            "isDone": false,
            "description": "test"
          }
        ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lot of stuff happening on this lines, first there is a keyword in the header &lt;code&gt;[GET]&lt;/code&gt; indicating the verb of the request and after that it's a &lt;strong&gt;response definition&lt;/strong&gt; (they must start with &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt; or &lt;code&gt;-&lt;/code&gt;, like a markdown list item) followed by the status code &lt;code&gt;200&lt;/code&gt; (mandatory) and the response &lt;code&gt;Content-Type&lt;/code&gt; &lt;code&gt;application/json&lt;/code&gt; (optional), and at the end an example of response body (example objects must be indented with 8 spaces or 2 tabs).&lt;/p&gt;

&lt;p&gt;What about the &lt;code&gt;POST&lt;/code&gt;?&lt;br&gt;
&lt;/p&gt;

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

### Create a New Task [POST]

+ Attributes
    + description: `Buy milk` (string) - Task description
    + isDone: false (boolean, required) - Done status

+ Request (application/json)

        {
          "description": "Buy milk",
          "isDone": false
        }

+ Response 201 (application/json)

        {
          "__v": 0,
          "updatedAt": "2017-04-09T16:30:42.010Z",
          "createdAt": "2017-04-09T16:30:42.010Z",
          "_id": "586e88337106b038d820a54f",
          "isDone": false,
          "description": "Buy milk"
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very similar to the &lt;code&gt;GET&lt;/code&gt; one but this time I've also specified the &lt;code&gt;Request&lt;/code&gt; and &lt;code&gt;Attributes&lt;/code&gt; definition.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;Attributes&lt;/code&gt; there is a list of items that represent the possible properties for the request body each one with the prop name, an example value, the type, if is required and a small description.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;Request&lt;/code&gt; I've defined an example of a request body object.&lt;/p&gt;

&lt;p&gt;Time to deal with URI params&lt;/p&gt;

&lt;h4&gt;
  
  
  URI Params
&lt;/h4&gt;

&lt;p&gt;For the resources that have to be accessed by attacking an URL with params (&lt;code&gt;/tasks/:id&lt;/code&gt; in my case) there is a way to define them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Task [/tasks/{taskId}]

+ Parameters

  + taskId: `586e88337106b038d820a54f` (string)

### View a Task [GET]

+ Response 200 (application/json)

        {
          "__v": 0,
          "updatedAt": "2017-04-09T16:30:42.010Z",
          "createdAt": "2017-04-09T16:30:42.010Z",
          "_id": "586e88337106b038d820a54f",
          "isDone": false,
          "description": "Buy milk"
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The properties defined in the URL with braces like &lt;code&gt;{taskId}&lt;/code&gt; will be related to the definitions with the same name in the &lt;code&gt;Parameters&lt;/code&gt; section. The &lt;code&gt;Parameters&lt;/code&gt; section uses the same nomenclature as &lt;code&gt;Attributes&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Data Structures
&lt;/h4&gt;

&lt;p&gt;It is a bit of a harsh to define in each section the same response so you can define a &lt;code&gt;Data Structures&lt;/code&gt; section in your docs to store some basic data structures.&lt;br&gt;
&lt;/p&gt;

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

### Task

+ _id: `586e88337106b038d820a54f` (string, required) - Task's ID
+ description: `Buy more milk` (string, required) - Task's description
+ isDone: false (boolean, required) - Done status
+ createdAt: `2017-04-09T16:30:42.010Z` (string, required) - Task's created date
+ updatedAt: `2017-04-09T16:30:42.010Z` (string, required) - Task's update date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then reuse them on your endpoint definitions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Edit a Task partially [PATCH]

+ Attributes
    + description: `Buy more milk` (string) - Task description
    + isDone: true (boolean) - Done status

+ Request (application/json)

        {
          "description": "Buy more milk"
        }

+ Response 200 (application/json)

        + Attributes (Task)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here in the &lt;code&gt;Response&lt;/code&gt; definition, I have used my &lt;code&gt;Attributes&lt;/code&gt; data structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;I think I've covered all the basic cases by now, you can read this &lt;a href="https://apiblueprint.org/documentation/advanced-tutorial.html"&gt;Advanced Tutorial about API Blueprint&lt;/a&gt; and define a much more robust API.&lt;/p&gt;

&lt;p&gt;As always you can &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/04"&gt;check the code on GitHub&lt;/a&gt; and you can review the &lt;a href="http://docs.anothertodo.apiary.io/"&gt;Another TODO API docs in Apiary&lt;/a&gt;&lt;/p&gt;

</description>
      <category>express</category>
      <category>node</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Mongoose, MongoDB and Express</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Wed, 15 Nov 2017 10:05:32 +0000</pubDate>
      <link>https://forem.com/albertofdzm/mongoose-mongodb-and-express-596</link>
      <guid>https://forem.com/albertofdzm/mongoose-mongodb-and-express-596</guid>
      <description>&lt;p&gt;First steps on ExpressJS API development to connect to a MongoDB database and start managing data using endpoints.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is the 3rd post of a series of post about &lt;strong&gt;Building APIs With Express&lt;/strong&gt;. Based on my last post about &lt;a href="https://dev.to/2016/12/17/api-routing-with-express/"&gt;API Routing with Express&lt;/a&gt; I'll continue developing over the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/02"&gt;generated code&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Last time, the awesome TODO API was leaved with a nice API Routing hierarchy, but! And this is an important "but". I didn't store any kind of data for future use, it's only storing the TODOs in temporal memory so once the server stops all the info is lost.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was first published on &lt;a href="http://onlythepixel.com/2017/01/05/mongoose-mongodb-and-express/"&gt;onlythepixel.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;For this posts, I'll need to have installed on my machine &lt;a href="https://www.mongodb.com/download-center#community"&gt;MongoDB&lt;/a&gt; to being able to develop my API with real connections in my local environment.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; I need to pay attention to &lt;a href="https://docs.mongodb.com/manual/administration/install-community/"&gt;have my MongoDB up and running&lt;/a&gt; to being able to work with it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also, I'm going to need &lt;a href="https://www.npmjs.com/package/mongoose"&gt;Mongoose&lt;/a&gt; as a dependency of my project, this package will help me with the DB communication and data models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add mongoose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mongoose connection to MongoDB
&lt;/h2&gt;

&lt;p&gt;First I need to let mongoose connect to my local MongoDB so I'm going to create a new script to take this job.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/db.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&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;debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;debug&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;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;another-todo:database&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;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;another-todo:database:error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// First I define my DB URI or&lt;/span&gt;
&lt;span class="c1"&gt;// make my script take it from the env variables&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DB_URI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DB_URI&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://localhost/another-todo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Define some basic methods to&lt;/span&gt;
&lt;span class="c1"&gt;// connect/disconnect to the DB&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DB_URI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nx"&gt;disconnect&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// This let mongoose use the node's default promises&lt;/span&gt;
&lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;

&lt;span class="c1"&gt;// Logs for our app&lt;/span&gt;
&lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connected&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mongoose connection open to &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;DB_URI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// More logs...&lt;/span&gt;
&lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disconnected&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mongoose disconnected&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;// Logs that I hope to not see&lt;/span&gt;
&lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&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&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Handle process terminations&lt;/span&gt;
&lt;span class="c1"&gt;// this ensures that there is any connection&lt;/span&gt;
&lt;span class="c1"&gt;// open with DB when I stop the app&lt;/span&gt;
&lt;span class="nx"&gt;process&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SIGINT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SIGTERM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// finally I only expose the methods to being used by my app script&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now I only need to use my &lt;code&gt;db&lt;/code&gt; script on my app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;morgan&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;bodyParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;body-parser&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&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;v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./v1&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;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Connect to DB!!&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Middlewares&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mongoose Models
&lt;/h2&gt;

&lt;p&gt;Now it's time to define the first mongoose model, at this moment the only model or &lt;strong&gt;relevant data to store in DB&lt;/strong&gt; are my tasks so so I only going to need the model.&lt;/p&gt;

&lt;p&gt;I'm going to use the same &lt;a href="https://dev.to/2016/12/17/api-routing-with-express/"&gt;&lt;strong&gt;data structure&lt;/strong&gt; that I used in my last post&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/models/task.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&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;Schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Schema&lt;/span&gt;

&lt;span class="c1"&gt;// I'm going to define a new schema&lt;/span&gt;
&lt;span class="c1"&gt;// Here is where I define the properties&lt;/span&gt;
&lt;span class="c1"&gt;// that my data is going to have&lt;/span&gt;
&lt;span class="c1"&gt;// along with its validations &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;taskSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

  &lt;span class="c1"&gt;// A property 'description' of type string&lt;/span&gt;
  &lt;span class="c1"&gt;// with a default to a empty string&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// And a boolean property with false as default&lt;/span&gt;
  &lt;span class="na"&gt;isDone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="na"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;taskSchema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; that &lt;code&gt;timestamps&lt;/code&gt; let me not having to define a property &lt;code&gt;createdAt&lt;/code&gt; or &lt;code&gt;updatedAt&lt;/code&gt; because it is going to add this value once that property is set to &lt;code&gt;true&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now is time to make use of this model in my API.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;src\v1\tasks.js&lt;/code&gt;
&lt;/h2&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Router&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;Task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../models/task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&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="nx"&gt;next&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;// I exec the find without conditions &lt;/span&gt;
    &lt;span class="c1"&gt;// to retrieve all my tasks&lt;/span&gt;
    &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasks&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tasks&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&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="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&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="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&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="nx"&gt;next&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;// This method is similar to find but instead&lt;/span&gt;
    &lt;span class="c1"&gt;// it removes all the occurrences &lt;/span&gt;
    &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;end&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="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;taskId&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="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="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&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;// Handle to find the requested resouce&lt;/span&gt;
  &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// If the task is not found then the app returns a 404&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;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&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;Task not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;404&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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:taskId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&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="nx"&gt;next&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;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&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;task&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="nx"&gt;put&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="nx"&gt;next&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;// I'm not using req.task.update() because&lt;/span&gt;
    &lt;span class="c1"&gt;// that method doesn't return the task on the callback&lt;/span&gt;
    &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByIdAndUpdate&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;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;$set&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="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Returns the updated task&lt;/span&gt;
      &lt;span class="na"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// Set the whole document even if we are not&lt;/span&gt;
      &lt;span class="c1"&gt;// receiving all the properties&lt;/span&gt;
      &lt;span class="na"&gt;overwrite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// Run validations if we have them&lt;/span&gt;
      &lt;span class="na"&gt;runValidators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;patch&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="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByIdAndUpdate&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;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;$set&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;runValidators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&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="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&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="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findByIdAndRemove&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;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;end&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can check the &lt;a href="http://mongoosejs.com/docs/api.html"&gt;Mongoose API docs&lt;/a&gt; for info about its different methods.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now it's time to try it!&lt;/p&gt;

&lt;h2&gt;
  
  
  cURL
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt;

&lt;span class="o"&gt;[]&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'description=test'&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:37.066Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:37.066Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e88217106b038d820a54e"&lt;/span&gt;,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'description=test'&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:55.067Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:55.067Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e88337106b038d820a54f"&lt;/span&gt;,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
        &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:37.066Z"&lt;/span&gt;,
        &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:37.066Z"&lt;/span&gt;,
        &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e88217106b038d820a54e"&lt;/span&gt;,
        &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
        &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:55.067Z"&lt;/span&gt;,
        &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:53:55.067Z"&lt;/span&gt;,
        &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e88337106b038d820a54f"&lt;/span&gt;,
        &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt;

HTTP/1.1 204 No Content
X-Powered-By: Express
Date: Thu, 05 Jan 2017 17:54:47 GMT
Connection: keep-alive

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'description=test'&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:54:53.555Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:54:53.555Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e886d7106b038d820a550"&lt;/span&gt;,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks/586e886d7106b038d820a550"&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e886d7106b038d820a550"&lt;/span&gt;,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:54:53.555Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:54:53.555Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks/586e886d7106b038d820a550"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'description=amazing'&lt;/span&gt; 

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e886d7106b038d820a550"&lt;/span&gt;,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:56:06.879Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:54:53.555Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"amazing"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks/586e886d7106b038d820a550"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'isDone=true'&lt;/span&gt; 

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e886d7106b038d820a550"&lt;/span&gt;,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:56:24.328Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:54:53.555Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"__v"&lt;/span&gt;: 0,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"amazing"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks/586e886d7106b038d820a550"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'isDone=false'&lt;/span&gt; 

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"_id"&lt;/span&gt;: &lt;span class="s2"&gt;"586e886d7106b038d820a550"&lt;/span&gt;,
    &lt;span class="s2"&gt;"createdAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:56:40.478Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"updatedAt"&lt;/span&gt;: &lt;span class="s2"&gt;"2017-01-05T17:56:40.478Z"&lt;/span&gt;,
    &lt;span class="s2"&gt;"isDone"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks/586e886d7106b038d820a550"&lt;/span&gt;

HTTP/1.1 204 No Content
X-Powered-By: Express
Date: Thu, 05 Jan 2017 17:57:35 GMT
Connection: keep-alive

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"http://localhost:3000/v1/tasks"&lt;/span&gt;

&lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the server stops and starts again the tasks still there, mission accomplished!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; I recommend to use &lt;a href="https://www.getpostman.com/"&gt;Postman&lt;/a&gt; to test the API instead of cURL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That all I think. You can &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/03"&gt;check the code on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>express</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>API Routing with Express</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Wed, 06 Sep 2017 19:15:59 +0000</pubDate>
      <link>https://forem.com/albertofdzm/api-routing-with-express</link>
      <guid>https://forem.com/albertofdzm/api-routing-with-express</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is the 2nd post of a series of post about &lt;strong&gt;Building APIs With Express&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Based on my last post about &lt;a href="https://dev.to/2016/12/11/making-apis-with-node-and-express/"&gt;Making APIs with Node and Express&lt;/a&gt; I'll continue developing over the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/01"&gt;generated code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, &lt;a href="https://dev.to/2016/12/11/making-apis-with-node-and-express/"&gt;I left the basement for my TODO API prepared&lt;/a&gt;. Now it's time to work in the different endpoints and HTTP verbs/methods that this API is going to use.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was first published on &lt;a href="http://onlythepixel.com/2016/12/17/api-routing-with-express/"&gt;onlythepixel.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;/v1/tasks&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I'm going to start building my API's endpoints with &lt;strong&gt;Tasks Collection&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[GET] /v1/tasks&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;First thing I need is to &lt;code&gt;GET&lt;/code&gt; the list of tasks from my so innovative TODO API and I think that the best way to build it is by creating a &lt;strong&gt;new isolated express router instance&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * TODO: Store data in DB.
 */&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Another task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;isDone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&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="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&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="nx"&gt;next&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;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Easy peasy! Now I need to &lt;strong&gt;mount&lt;/strong&gt; that router on my API, I'm going to remove the old &lt;code&gt;Let's TODO!&lt;/code&gt; message:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/index.js&lt;/code&gt;
&lt;/h4&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Router&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;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tasks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/tasks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's try the new endpoint (Now that I have implemented &lt;code&gt;yarn&lt;/code&gt; I can run the server with &lt;code&gt;`yarn start` instead of `npm start`):&lt;br&gt;
&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
curl -X GET localhost:3000/v1/tasks&lt;br&gt;
[&lt;br&gt;
   {&lt;br&gt;
      "createdAt" : 1481985039988,&lt;br&gt;
      "isDone" : false,&lt;br&gt;
      "description" : "Another task"&lt;br&gt;
   }&lt;br&gt;
]&lt;br&gt;
&lt;/code&gt;``&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; It's needed to restart the server if there have been changes in the code while it is running to see the changes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now I'll continue with the creation of a new task&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[POST] /v1/tasks&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;It should be in the same router instance the &lt;code&gt;GET&lt;/code&gt; method is. This time I'll need a new middleware to parse correctly the &lt;a href="http://expressjs.com/en/4x/api.html#req.body"&gt;request body&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/body-parser"&gt;body-parser&lt;/a&gt; (this time I'll install it with Yarn).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`bash&lt;br&gt;
yarn add body-parser&lt;br&gt;
`&lt;/code&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Same as execute &lt;code&gt;npm i -S body-parser&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And now it needs to be attached to the app&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
const express = require('express')&lt;br&gt;
const logger = require('morgan')&lt;br&gt;
const bodyParser = require('body-parser')&lt;br&gt;
const app = express()&lt;br&gt;
const v1 = require('./v1')&lt;/p&gt;

&lt;p&gt;/**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Middlewares
*/
app.use(logger('dev'))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
_**Note:** It will inject data from the request into&lt;/code&gt;req.body`._&lt;/p&gt;

&lt;p&gt;And now the request handler.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;router.route('/')&lt;/p&gt;

&lt;p&gt;.get((req, res, next) =&amp;gt; {&lt;br&gt;
    return res.json(tasks)&lt;br&gt;
  })&lt;/p&gt;

&lt;p&gt;.post((req, res, next) =&amp;gt; {&lt;br&gt;
    const newTask = req.body&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;newTask.createdAt = Date.now()
newTask.isDone = false
tasks.push(newTask)

return res.status(201).json(newTask)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})&lt;/p&gt;

&lt;p&gt;module.exports = router&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Take advantage of the &lt;a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes"&gt;HTTP status codes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Done, let's try again with a &lt;code&gt;POST&lt;/code&gt; request this time:&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;bash&lt;br&gt;
curl -X POST -H "Content-Type: application/json" --data '{"description": "Also another task more"}' localhost:3000/v1/tasks&lt;br&gt;
{"description":"Also another task more","createdAt":1481986821539}&lt;/p&gt;

&lt;p&gt;curl -X GET localhost:3000/v1/tasks&lt;br&gt;
[&lt;br&gt;
   {&lt;br&gt;
      "createdAt" : 1481986807819,&lt;br&gt;
      "isDone" : false,&lt;br&gt;
      "description" : "Another task"&lt;br&gt;
   },&lt;br&gt;
   {&lt;br&gt;
      "createdAt" : 1481986821539,&lt;br&gt;
      "isDone" : false,&lt;br&gt;
      "description" : "Also another task more"&lt;br&gt;
   }&lt;br&gt;
]&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;Time to delete! Due this is an endpoint pointing a collection when it receives a &lt;code&gt;DELETE&lt;/code&gt; request &lt;strong&gt;it should delete all items of the collection&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[DELETE] /v1/tasks&lt;/code&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;.post((req, res, next) =&amp;gt; {&lt;br&gt;
    const newTask = req.body&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;newTask.createdAt = Date.now()
tasks.push(newTask)

return res.json(newTask)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})&lt;/p&gt;

&lt;p&gt;.delete((req, res, next) =&amp;gt; {&lt;br&gt;
    tasks = []&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;res.status(204).end()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})&lt;/p&gt;

&lt;p&gt;module.exports = router&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;Delete all the things!&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;bash&lt;br&gt;
curl -X DELETE -i localhost:3000/v1/tasks&lt;/p&gt;

&lt;p&gt;HTTP/1.1 204 No Content&lt;br&gt;
X-Powered-By: Express&lt;br&gt;
ETag: W/"2-11FxOYiYfpMxmANj4kGJzg"&lt;br&gt;
Date: Sat, 17 Dec 2016 17:13:07 GMT&lt;br&gt;
Connection: keep-alive&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;I am done with this endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;/v1/tasks/:taskId&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Now it's time to handle the single task endpoint. Here I'm going to take advantage of an &lt;a href="http://expressjs.com/en/4x/api.html#app.param"&gt;Express feature to parse URLs, for this case, to treat a segment of the URL as a parameter&lt;/a&gt; and assigning it the name &lt;code&gt;taskId&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;taskId&lt;/code&gt; param
&lt;/h3&gt;

&lt;p&gt;I am going to define a new param for the tasks router to get a certain task passing the task ID in the URL.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;router.route('/')&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;router.param('taskId', (req, res, next, id) =&amp;gt; {&lt;br&gt;
  const task = tasks[id]&lt;br&gt;
  let err&lt;/p&gt;

&lt;p&gt;if (!task) {&lt;br&gt;
    err = new Error('Task not found')&lt;br&gt;
    err.status = 404&lt;br&gt;
  } else {&lt;br&gt;
    req.task = task&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return next(err)&lt;br&gt;
})&lt;/p&gt;

&lt;p&gt;module.exports = router&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[GET] /v1/tasks/:taskId&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Then I only need to reply with the found task in a new endpoint listening to any request aimed to &lt;code&gt;/v1/tasks/:taskId&lt;/code&gt; meaning by &lt;code&gt;:taskId&lt;/code&gt; whatever comes after the slash (IE: &lt;code&gt;/v1/tasks/my-task-id&lt;/code&gt; OR &lt;code&gt;/v1/tasks/01234&lt;/code&gt;).&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;router.param('taskId', (req, res, next, id) =&amp;gt; {&lt;br&gt;
  ...&lt;br&gt;
})&lt;/p&gt;

&lt;p&gt;router.route('/:taskId')&lt;/p&gt;

&lt;p&gt;.get((req, res, next) =&amp;gt; {&lt;br&gt;
    return res.json(req.task)&lt;br&gt;
  })&lt;/p&gt;

&lt;p&gt;module.exports = router&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;Let's try it&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;bash&lt;br&gt;
curl -X GET localhost:3000/v1/tasks/0&lt;br&gt;
{&lt;br&gt;
   "description" : "Another task",&lt;br&gt;
   "isDone" : false,&lt;br&gt;
   "createdAt" : 1481996187751&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;curl -X GET -i localhost:3000/v1/tasks/1234&lt;/p&gt;

&lt;p&gt;HTTP/1.1 404 Not Found&lt;br&gt;
X-Powered-By: Express&lt;br&gt;
Content-Type: application/json; charset=utf-8&lt;br&gt;
Content-Length: 1082&lt;br&gt;
ETag: W/"43a-4d6NK29IKrV0B3jSAdQGvA"&lt;br&gt;
Date: Sat, 17 Dec 2016 17:46:36 GMT&lt;br&gt;
Connection: keep-alive&lt;br&gt;
{&lt;br&gt;
   "stack" : "Error: Task not found\n    at router.param (/develop/another-todo-api/src/v1/tasks.js:38:11)\n    at paramCallback (/develop/another-todo-api/node_modules/express/lib/router/index.js:404:7)\n    at param (/develop/another-todo-api/node_modules/express/lib/router/index.js:384:5)\n    at Function.process_params (/develop/another-todo-api/node_modules/express/lib/router/index.js:410:3)\n    at next (/develop/another-todo-api/node_modules/express/lib/router/index.js:271:10)\n    at Function.handle (/develop/another-todo-api/node_modules/express/lib/router/index.js:176:3)\n    at router (/develop/another-todo-api/node_modules/express/lib/router/index.js:46:12)\n    at Layer.handle &lt;a href="///develop/another-todo-api/node_modules/express/lib/router/layer.js:95:5"&gt;as handle_request&lt;/a&gt;\n    at trim_prefix (/develop/another-todo-api/node_modules/express/lib/router/index.js:312:13)\n    at /develop/another-todo-api/node_modules/express/lib/router/index.js:280:7",&lt;br&gt;
   "message" : "Task not found"&lt;br&gt;
}&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[POST] /v1/tasks/:taskId&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Now it's important to pay attention here because the &lt;code&gt;POST&lt;/code&gt; request to a specified resource in an API REST by definition should &lt;strong&gt;override completely the resource&lt;/strong&gt;, meaning that if:&lt;br&gt;
I do a &lt;code&gt;GET&lt;/code&gt; to &lt;code&gt;/v1/tasks/0&lt;/code&gt; receiving:&lt;br&gt;
&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
   "description" : "Another task",&lt;br&gt;
   "isDone" : false,&lt;br&gt;
   "createdAt" : 1481996187751&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;br&gt;
If I do a &lt;code&gt;POST&lt;/code&gt; to &lt;code&gt;/v1/tasks/0&lt;/code&gt; with this data:&lt;br&gt;
&lt;code&gt;`json&lt;br&gt;
{ "isDone": true }&lt;br&gt;
`&lt;/code&gt;&lt;br&gt;
The next time I do a &lt;code&gt;GET&lt;/code&gt; to &lt;code&gt;/v1/tasks/0&lt;/code&gt; I'll receive the next response:&lt;br&gt;
&lt;code&gt;`json&lt;br&gt;
{ "isDone": true }&lt;br&gt;
`&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;The proper way a client should make a &lt;code&gt;POST&lt;/code&gt; to an API resource is by providing all the resource info in the request to avoid the lose of info&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now go back to code!&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;br&gt;
  .post((req, res, next) =&amp;gt; {&lt;br&gt;
    const updatedTask = req.body&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tasks[req.params.taskId] = updatedTask

return res.json(updatedTask)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})&lt;br&gt;
...&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[PATCH] /v1/tasks/:taskId&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Now the &lt;strong&gt;&lt;code&gt;PATCH&lt;/code&gt; request is the one used to update partially a resource in an API REST&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;br&gt;
  .patch((req, res, next) =&amp;gt; {&lt;br&gt;
    for (let prop in req.body) {&lt;br&gt;
      tasks[req.params.taskId][prop] = req.body[prop]&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return res.json(tasks[req.params.taskId])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})&lt;br&gt;
...&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;Let's try this one with &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;code&gt;`bash&lt;br&gt;
curl -X PATCH -H "Content-Type: application/json" --data '{"isDone": true}' localhost:3000/v1/tasks/0&lt;br&gt;
{&lt;br&gt;
   "isDone" : true,&lt;br&gt;
   "description" : "Another task",&lt;br&gt;
   "createdAt" : 1481998868351&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Oh yeah!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;[DELETE] /v1/tasks/:taskId&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;I think there's no much to explain here, is pretty much the same as the &lt;code&gt;DELETE&lt;/code&gt; for the whole collections instead that this one only deletes one resource.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/v1/tasks.js&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;javascript&lt;br&gt;
...&lt;br&gt;
  .delete((req, res, next) =&amp;gt; {&lt;br&gt;
    tasks.splice(req.params.taskId, 1)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;res.status(204).end()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})&lt;br&gt;
...&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h2&gt;
  
  
  End of the route
&lt;/h2&gt;

&lt;p&gt;Well, I think that with this the awesome Another TODO API is completely functional, maybe I should care about that &lt;strong&gt;the info isn't being stored anywhere and every time the server stops I lose it all&lt;/strong&gt;, but that'll be another time!&lt;/p&gt;

&lt;p&gt;Comment and &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/02"&gt;check the code on GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>node</category>
      <category>express</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Making APIs with Node and Express</title>
      <dc:creator>Alberto Fernandez Medina</dc:creator>
      <pubDate>Fri, 01 Sep 2017 19:48:33 +0000</pubDate>
      <link>https://forem.com/albertofdzm/making-apis-with-node-and-express</link>
      <guid>https://forem.com/albertofdzm/making-apis-with-node-and-express</guid>
      <description>&lt;p&gt;I'm going to make a simple API with &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node&lt;/a&gt; and &lt;a href="http://expressjs.com/" rel="noopener noreferrer"&gt;Express&lt;/a&gt;, specifically an API for a TODOs app.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was first published on &lt;a href="http://onlythepixel.com/2016/12/11/making-apis-with-node-and-express/" rel="noopener noreferrer"&gt;my blog, onlythepixel.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Boilerplate
&lt;/h2&gt;

&lt;p&gt;So I start a new Node project with the name &lt;code&gt;another-todo-api&lt;/code&gt; in my terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;another-todo-api &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;
git init
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Another boring TODO API'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; README.md
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'node_modules
*.log'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
npm i &lt;span class="nt"&gt;-S&lt;/span&gt; express
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'First commit'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;npm i -S&lt;/code&gt; is the same as &lt;code&gt;npm install --save&lt;/code&gt; but in the shorter way.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Simple! I've started a new git repo with an empty README file and a new npm package that has express as a dependency. Let's play a little with Express.&lt;/p&gt;

&lt;p&gt;I like to have all my source code inside a &lt;code&gt;src&lt;/code&gt; folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src
&lt;span class="nb"&gt;touch &lt;/span&gt;src/index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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="s1"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Due to the coolness of this article all the javascript code will be shown in ES2015 (So it's recommended to use Node v6 or later) and I'll be using &lt;a href="http://standardjs.com/index.html" rel="noopener noreferrer"&gt;Standard Code Style&lt;/a&gt; for the javascript.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now to run the server I don't like to start it from the &lt;code&gt;index.js&lt;/code&gt; file directly, instead, I prefer to run it through an external bin file (like &lt;a href="https://github.com/expressjs/generator/blob/d07ce53595086dd07efb100279a7b7addc059418/templates/js/www" rel="noopener noreferrer"&gt;Express does in its generator&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;bin/www&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cp"&gt;#!/usr/bin/env node
&lt;/span&gt;&lt;span class="cm"&gt;/**
 * Created from https://github.com/expressjs/generator/blob/d07ce53595086dd07efb100279a7b7addc059418/templates/js/www
 */&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Module dependencies.
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&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="s1"&gt;http&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;debug&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="s1"&gt;debug&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;another-todo:server&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;app&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="s1"&gt;../src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Get port from environment and store in Express.
 */&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalizePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3000&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;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;port&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Create HTTP server.
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&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="cm"&gt;/**
 * Normalize a port into a number, string, or false.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;normalizePort&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&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;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// named pipe&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;

  &lt;span class="c1"&gt;// port number&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;port&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Event listener for HTTP server "error" event.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onError&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="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="nx"&gt;syscall&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;listen&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="nx"&gt;error&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&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;Pipe &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Port &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;

  &lt;span class="c1"&gt;// handle specific listen errors with friendly messages&lt;/span&gt;
  &lt;span class="k"&gt;switch &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;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EACCES&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; requires elevated privileges&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&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="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EADDRINUSE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; is already in use&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&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="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;throw&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="cm"&gt;/**
 * Event listener for HTTP server "listening" event.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onListening&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;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;address&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;bind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&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;pipe &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;addr&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;port &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;
  &lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Listening on &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Listen on provided port, on all network interfaces.
 */&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;listening&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onListening&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then bind this file to my npm scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set DEBUG=another-todo:* &amp;amp;&amp;amp; node bin/www"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also I'll need the package &lt;a href="https://www.npmjs.com/package/debug" rel="noopener noreferrer"&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/a&gt; as dependency of my project due that I'm using it in my &lt;code&gt;www&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-S&lt;/span&gt; debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that I can try my brand new Express server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; another-todo-api@0.0.0 start /develop/another-todo-api
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;another-todo:&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; node bin/www

  another-todo:server Listening on port 3000 +0ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default this little guy should be listening on the port &lt;code&gt;3000&lt;/code&gt; of my computer. If I access with some browser to &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/a&gt; I'll receive a sad &lt;code&gt;Cannot GET /&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://expressjs.com/en/4x/api.html#router" rel="noopener noreferrer"&gt;Express Router&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Time to make this guy have some voice to being able to reply me when I ask for something. For that I'll use the Express Routers to build up my TODO API pieces.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/v1/index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&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="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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="nx"&gt;next&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;return&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Let&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;s TODO!&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; that thing of &lt;code&gt;v1&lt;/code&gt; is because it's a good practice to implement a version system in APIs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Just a simple reply to a GET request, if I go to &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/a&gt; again, nothing happens... Because I need to mount this router path in my Express app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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="s1"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;v1&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="s1"&gt;./v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Routes
 */&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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would work just fine! If I visit &lt;a href="http://localhost:3000/v1" rel="noopener noreferrer"&gt;&lt;code&gt;http://localhost:3000/v1&lt;/code&gt;&lt;/a&gt; this thing will have voice now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Let's TODO!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="http://expressjs.com/en/guide/using-middleware.html" rel="noopener noreferrer"&gt;Middlewares&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Now I'm going to add some middleware to avoid contact with Systems that doesn't support  JSON format.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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="s1"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;v1&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="s1"&gt;./v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Ensure JSON acceptance
 */&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;use&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="nx"&gt;next&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;let&lt;/span&gt; &lt;span class="nx"&gt;err&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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accepts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&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="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&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;Not Acceptable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;406&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Routes
 */&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that I have a middleware that is returning an error I can test it with &lt;a href="https://curl.haxx.se/" rel="noopener noreferrer"&gt;&lt;code&gt;curl&lt;/code&gt;&lt;/a&gt; (probably you already have it in your terminal).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: text"&lt;/span&gt; localhost:3000

HTTP/1.1 406 Not Acceptable
X-Powered-By: Express
X-Content-Type-Options: nosniff
Content-Type: text/html&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf-8
Content-Length: 1052
Date: Sun, 11 Dec 2016 18:40:03 GMT
Connection: keep-alive

Error: Not Acceptable&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at app.use &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/src/index.js:9:11&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at Layer.handle &lt;span class="o"&gt;[&lt;/span&gt;as handle_request] &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/router/layer.js:95:5&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at trim_prefix &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/router/index.js:312:13&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at /develop/another-todo-api/node_modules/express/lib/router/index.js:280:7&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at Function.process_params &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/router/index.js:330:12&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at next &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/router/index.js:271:10&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at expressInit &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/middleware/init.js:33:5&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at Layer.handle &lt;span class="o"&gt;[&lt;/span&gt;as handle_request] &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/router/layer.js:95:5&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at trim_prefix &lt;span class="o"&gt;(&lt;/span&gt;/develop/another-todo-api/node_modules/express/lib/router/index.js:312:13&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;br&amp;gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt; &amp;amp;nbsp&lt;span class="p"&gt;;&lt;/span&gt;at /develop/another-todo-api/node_modules/express/lib/router/index.js:280:7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; If I try it without the &lt;code&gt;--header "Accept: text"&lt;/code&gt; it will reply my with the correct response.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mind your language young man! It's answering me in &lt;code&gt;HTML&lt;/code&gt; I need to parse that reply passing it through a Error Handler .&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://expressjs.com/en/guide/error-handling.html" rel="noopener noreferrer"&gt;ErrorHandler&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Now that my app has errors (in the good meaning) I need a ErrorHandler on my app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="cm"&gt;/**
 * Routes
 */&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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * ErrorHandler
 */&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;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&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="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&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="na"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stack&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; It's important to remember only to use that ErrorHandler only in development and try not to show so many info when it's a production environment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If I ask my server again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: text"&lt;/span&gt; localhost:3000

HTTP/1.1 406 Not Acceptable
X-Powered-By: Express
X-Content-Type-Options: nosniff
Content-Type: text/html&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf-8
Content-Length: 1052
Date: Sun, 11 Dec 2016 18:42:12 GMT
Connection: keep-alive

&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;:&lt;span class="s2"&gt;"Not Acceptable"&lt;/span&gt;,&lt;span class="s2"&gt;"stack"&lt;/span&gt;:&lt;span class="s2"&gt;"Error: Not Acceptable&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at app.use (/develop/another-todo-api/src/index.js:9:11)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at Layer.handle [as handle_request] (/develop/another-todo-api/node_modules/express/lib/router/layer.js:95:5)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;
    at trim_prefix (/develop/another-todo-api/node_modules/express/lib/router/index.js:312:13)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at /develop/another-todo-api/node_modules/express/lib/router/index.js:280:7&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at Function.process_params (/develop/another-todo-api/node_modules/express/lib/router/index.js:330:12)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at next (/develop/another-todo-api/node_modules/express/lib/router/index.js:271:10)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at expressInit (/develop/another-todo-api/node_modules/express/lib/middleware/init.js:33:5)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at Layer.handle [as handle_request] (/develop/another-todo-api/node_modules/express/lib/router/layer.js:95:5)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at trim_prefix (/develop/another-todo-api/node_modules/express/lib/router/index.js:312:13)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    at /develop/another-todo-api/node_modules/express/lib/router/index.js:280:7"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that's a good error reply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extras
&lt;/h2&gt;

&lt;p&gt;I leaved some things pending on my code when building my API server, you can skip this part if you feel lazy about continue reading this crap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging with &lt;a href="https://www.npmjs.com/package/morgan" rel="noopener noreferrer"&gt;Morgan&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;There are tons of middlewares packages for express, one very useful is Morgan, it's an HTTP request logger and it'll print in the terminal all the request that the server will receive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-S&lt;/span&gt; morgan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I need to &lt;em&gt;attach&lt;/em&gt; it to my app.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;src/index.js&lt;/code&gt;
&lt;/h4&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;express&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="s1"&gt;express&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;logger&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="s1"&gt;morgan&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;v1&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="s1"&gt;./v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Middlewares
 */&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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dev&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;Now if I run my server and make some requests to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; another-todo-api@0.0.0 start /develop/another-todo-api
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;another-todo:&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; node bin/www

  another-todo:server Listening on port 3000 +0ms
GET / 404 5.469 ms - 13
GET /favicon.ico 404 0.905 ms - 24
GET /v1 200 2.275 ms - 25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Linting
&lt;/h3&gt;

&lt;p&gt;I said that I was using &lt;a href="http://standardjs.com/" rel="noopener noreferrer"&gt;Standar code style&lt;/a&gt; fot the javascript code but I didn't bother to make me sure that this code style get used every time someone writes code on this project. The best way to do this is with some linter and for this I'm going to use &lt;a href="http://eslint.org/" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First I need to install my development dependencies (because this tools are not going to be used in production):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-D&lt;/span&gt; eslint eslint-config-standard eslint-plugin-standard eslint-plugin-promise
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;npm i -D&lt;/code&gt; is the same as &lt;code&gt;npm install --save-dev&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now I need to define some &lt;a href="http://eslint.org/docs/user-guide/configuring" rel="noopener noreferrer"&gt;configuration file&lt;/a&gt; on my project code.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;.eslintrc&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standard"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Just that!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And I'm going to add a new npm script.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;package.json&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint **/*.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set DEBUG=another-todo:* &amp;amp;&amp;amp; node bin/www"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Time to try it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run lint

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; another-todo-api@0.0.0 lint /develop/another-todo-api
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eslint &lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; If nothing happens is because there's no errors, you can try to reproduce an error by adding some &lt;code&gt;;&lt;/code&gt; in some of the JS files.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are several plugins for linting the code &lt;em&gt;on the fly&lt;/em&gt; in the text editor, so by this way you don't need to run the linting npm script. In my case I use &lt;a href="https://atom.io/" rel="noopener noreferrer"&gt;Atom&lt;/a&gt; with &lt;a href="https://atom.io/packages/linter" rel="noopener noreferrer"&gt;linter&lt;/a&gt; and &lt;a href="https://atom.io/packages/linter-eslint" rel="noopener noreferrer"&gt;linter-eslint&lt;/a&gt; packages.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://editorconfig.org/" rel="noopener noreferrer"&gt;Editorconfig&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is a very important tool, it avoids a lot of noise between commits on git or git diffs. Also it helps to keep the code format homogeneous among the project.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;.editorconfig&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# EditorConfig is awesome: http://EditorConfig.org
&lt;/span&gt;
&lt;span class="py"&gt;root&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[*]&lt;/span&gt;
&lt;span class="py"&gt;charset&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;utf-8&lt;/span&gt;
&lt;span class="py"&gt;end_of_line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;lf&lt;/span&gt;
&lt;span class="py"&gt;indent_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2&lt;/span&gt;
&lt;span class="py"&gt;indent_style&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;space&lt;/span&gt;
&lt;span class="py"&gt;insert_final_newline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;trim_trailing_whitespace&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[*.md]&lt;/span&gt;
&lt;span class="py"&gt;trim_trailing_whitespace&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As for the linting there is also plugins available for the usuals text editors. In the case of Atom there is the &lt;a href="https://atom.io/packages/editorconfig" rel="noopener noreferrer"&gt;editorconfig&lt;/a&gt; package.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://yarnpkg.com/" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Not long ago Yarn, a new dependency manager, got released and it's fully compatible with npm. Only needs to be installed and then just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is the same as &lt;code&gt;yarn install&lt;/code&gt; that is the same as &lt;code&gt;npm install&lt;/code&gt;. You can check the &lt;a href="https://yarnpkg.com/en/docs/migrating-from-npm#toc-cli-commands-comparison" rel="noopener noreferrer"&gt;Yarn vs. NPM command comparison&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There will appear a new file called &lt;code&gt;yarn.lock&lt;/code&gt; that's info used by Yarn to improve the timing installing dependencies and if you red the first lines of the file all will be &lt;em&gt;Crystal Clear&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here I can start using Yarn instead NPM for dependencies and NPM scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enough!!!
&lt;/h2&gt;

&lt;p&gt;This post is long enough to bore you so I'm going to stop here. Later!&lt;/p&gt;

&lt;p&gt;Oh! Yes... you can check this code on the &lt;a href="https://github.com/AlbertoFdzM/another-todo-api/tree/post/01" rel="noopener noreferrer"&gt;another-todo-api GitHub repo&lt;/a&gt;.&lt;/p&gt;

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