<?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: Camille Gabrieli</title>
    <description>The latest articles on Forem by Camille Gabrieli (@aziaziazi).</description>
    <link>https://forem.com/aziaziazi</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%2F339749%2Fdb414463-7fa4-44bd-9f87-514e9f0b963e.jpeg</url>
      <title>Forem: Camille Gabrieli</title>
      <link>https://forem.com/aziaziazi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aziaziazi"/>
    <language>en</language>
    <item>
      <title>Set up an Express development environment</title>
      <dc:creator>Camille Gabrieli</dc:creator>
      <pubDate>Thu, 24 Sep 2020 13:43:39 +0000</pubDate>
      <link>https://forem.com/aziaziazi/set-up-an-express-development-environment-19p8</link>
      <guid>https://forem.com/aziaziazi/set-up-an-express-development-environment-19p8</guid>
      <description>&lt;p&gt;I'm learning NodeJS following Odin's Express course and write here my notes. Today we're setting up the environment to use Express on macOS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;We'll need to install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node and npm&lt;/strong&gt; globally. I recommend you to use &lt;a href="https://github.com/nvm-sh/nvm#installing-and-updating"&gt;nvm&lt;/a&gt;, it will help you manage multiple versions of node on your machine and updating them is needed. For the node version, uses the &lt;em&gt;LTS&lt;/em&gt; which is the more stable, or the &lt;em&gt;current&lt;/em&gt; with newer features. Npm is installed alongside with node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express&lt;/strong&gt; locally for each app, using &lt;em&gt;npm&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;other libraries&lt;/strong&gt; like template engines, database drivers, authentication middleware, middleware to serve static files... using &lt;em&gt;npm&lt;/em&gt;. I won't talk about them here since they really depends of your need.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;&lt;a href="https://expressjs.com/fr/starter/generator.html"&gt;Express Application Generator&lt;/a&gt;&lt;/strong&gt; is a handy tool to create a modular skeleton Express app following the &lt;em&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/MVC"&gt;MVC&lt;/a&gt;&lt;/em&gt; pattern. We'll use it here.&lt;/p&gt;

&lt;h1&gt;
  
  
  Express Application Generator
&lt;/h1&gt;

&lt;p&gt;After installing npm (with node, using nvm), we can use it to install the Express Application Generator.&lt;/p&gt;

&lt;p&gt;We install it globaly (&lt;code&gt;-g&lt;/code&gt; flag) because it won't be a dependency of our application. Instead, it's run once to create "skeletons" of apps. Run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express-generator &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;cd&lt;/code&gt; where you want to create your app and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;express helloNode
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This should create a folder named "helloNode" with the base express app. &lt;code&gt;express -h&lt;/code&gt; outputs available options, like installing a template library.&lt;/p&gt;

&lt;p&gt;Then enter the folder and install the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;helloNode
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now ready to go ! Let's run the app with the &lt;code&gt;DEBUG&lt;/code&gt; environment variable set to the name of your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;helloworld:&lt;span class="k"&gt;*&lt;/span&gt; npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Our app is running at &lt;a href="http://127.0.0.1:3000/"&gt;http://127.0.0.1:3000/&lt;/a&gt; !&lt;/p&gt;

&lt;h1&gt;
  
  
  Next
&lt;/h1&gt;

&lt;p&gt;Now our bare app is running, we'll probably need to install others libraries to work with databases, authentication and others middlewares. Then we'll want to prepare the environment on the server to run the app in production.&lt;/p&gt;

</description>
      <category>node</category>
      <category>todayilearned</category>
      <category>express</category>
    </item>
    <item>
      <title>Express 101</title>
      <dc:creator>Camille Gabrieli</dc:creator>
      <pubDate>Wed, 23 Sep 2020 15:35:17 +0000</pubDate>
      <link>https://forem.com/aziaziazi/express-101-33ah</link>
      <guid>https://forem.com/aziaziazi/express-101-33ah</guid>
      <description>&lt;p&gt;I'm learning NodeJS following Odin's Express course and write here my notes. Each courses on Odin have a &lt;em&gt;Learning Outcomes&lt;/em&gt; section for self evaluation, today I'll use it here as a template:&lt;/p&gt;

&lt;h1&gt;
  
  
  Describe Express and Node’s main benefits.
&lt;/h1&gt;

&lt;p&gt;Node is a great choice for web development because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's optimized for &lt;strong&gt;network speed and scalability&lt;/strong&gt; because it's event-driven.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;ecosystem&lt;/strong&gt; (with npm) is big and the &lt;strong&gt;community&lt;/strong&gt; active.&lt;/li&gt;
&lt;li&gt;As it's &lt;strong&gt;plain JS&lt;/strong&gt;, they're easy to write and maintain with the front end (in JS too). Also, the popularity of JS brought many others languages to compile in it: TypeScript, ClojureScript, coffeeScript, Scala, LiveScript...&lt;/li&gt;
&lt;li&gt;Node is also &lt;strong&gt;portable&lt;/strong&gt; in Windows, macOS, Linux, Solaris, FreeBSD, OpenBSD, WebOS and NonStopOS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Express provide tools and helpers for common tasks on web servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handlers for HTTP &lt;strong&gt;routes&lt;/strong&gt; and &lt;strong&gt;verbs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Integrate with &lt;strong&gt;view&lt;/strong&gt; rendering engines&lt;/li&gt;
&lt;li&gt;Set common &lt;strong&gt;webapp settings&lt;/strong&gt;: ports, location for templates.&lt;/li&gt;
&lt;li&gt;custom &lt;strong&gt;Middlewares&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Lots of &lt;a href="http://expressjs.com/en/resources/middleware.html"&gt;middleware packages&lt;/a&gt;: cookies, sessions, login, url params...&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Describe the relationship between Node and Express.
&lt;/h1&gt;

&lt;p&gt;Express is a node framework: it provides functions to do common tasks. However, it's unopinionated: more flexible but harder to set up.&lt;/p&gt;

&lt;h1&gt;
  
  
  Explain what a module is and how Express fits in.
&lt;/h1&gt;

&lt;p&gt;A module is a bit of code (usually a file or folder) that we can import in our code to add functionalities. Express is a module, so are express middlewares.&lt;/p&gt;

&lt;h1&gt;
  
  
  Import and create modules.
&lt;/h1&gt;

&lt;p&gt;Import a module with &lt;code&gt;require&lt;/code&gt;: &lt;code&gt;var importedModule = require('./path/to/module')&lt;/code&gt;. Create a module with &lt;code&gt;modules.exports = {exportedKey: 'value}&lt;/code&gt; or &lt;code&gt;exports.exportedKey = 'value'&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Describe asynchronous APIs.
&lt;/h1&gt;

&lt;p&gt;Asynchronous APIs handle actions that takes time without blocking the thread: the action run in the background and trigger a "callback" when it's resolved. There's various way to handle them: &lt;strong&gt;callback&lt;/strong&gt;, &lt;strong&gt;promises&lt;/strong&gt;, &lt;strong&gt;generators&lt;/strong&gt;, &lt;strong&gt;async/await&lt;/strong&gt;... The more important is to keep code simple, not nested and split up in small modules. Be carefully of &lt;a href="http://callbackhell.com/"&gt;callback hell&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;A convention for node and Express is to use &lt;a href="http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/"&gt;Error First Callbacks&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Describe and create route handlers.
&lt;/h1&gt;

&lt;p&gt;We use handlers to trigger actions when a route is reach by a user. Usually, the action is to respond with a page! There's many handler methods to respond to different cases: &lt;code&gt;checkout()&lt;/code&gt;, &lt;code&gt;copy()&lt;/code&gt;, &lt;code&gt;delete()&lt;/code&gt;, &lt;code&gt;get()&lt;/code&gt;, &lt;code&gt;head()&lt;/code&gt;, &lt;code&gt;lock()&lt;/code&gt;, &lt;code&gt;merge()&lt;/code&gt;, &lt;code&gt;mkactivity()&lt;/code&gt;, &lt;code&gt;mkcol()&lt;/code&gt;, &lt;code&gt;move(),&lt;/code&gt; &lt;code&gt;m-search()&lt;/code&gt;, &lt;code&gt;notify()&lt;/code&gt;, &lt;code&gt;options()&lt;/code&gt;, &lt;code&gt;patch()&lt;/code&gt;, &lt;code&gt;post()&lt;/code&gt;, &lt;code&gt;purge()&lt;/code&gt;, &lt;code&gt;put()&lt;/code&gt;, &lt;code&gt;report()&lt;/code&gt;, &lt;code&gt;search()&lt;/code&gt;, &lt;code&gt;subscribe()&lt;/code&gt;, &lt;code&gt;trace()&lt;/code&gt;, &lt;code&gt;unlock()&lt;/code&gt;, &lt;code&gt;unsubscribe()&lt;/code&gt;. They mostly use te same arguments: a pattern to match the route (ex: &lt;code&gt;/about&lt;/code&gt;), and a callback function that takes as arguments the &lt;code&gt;request&lt;/code&gt; and the &lt;code&gt;response&lt;/code&gt;. Uses one of the &lt;a href="https://expressjs.com/en/guide/routing.html#response-methods"&gt;response methods&lt;/a&gt; to return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/02-route-handler.js&lt;/span&gt;

&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/about&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;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="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;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;about page&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;&lt;code&gt;app.all&lt;/code&gt; is usually used for middlewares.&lt;/p&gt;

&lt;p&gt;We can &lt;a href="http://expressjs.com/en/guide/routing.html#express-router"&gt;group handlers&lt;/a&gt; to organize the code. Do so with &lt;code&gt;app.use()&lt;/code&gt; and &lt;code&gt;router&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Describe and use middleware.
&lt;/h1&gt;

&lt;p&gt;A Middleware is a method executing before or after handlers. They are frequent in Express and helps with many tasks. The order the middlewares executes is up to the developer. It must call &lt;code&gt;next()&lt;/code&gt; (third argument of the function) to pass to the next middleware or handler, or end the request. &lt;code&gt;next('router')&lt;/code&gt; to pass controll out of the router instance.&lt;/p&gt;

&lt;p&gt;Add a middleware the same way as route handlers: &lt;code&gt;app.use('/', a_middleware, another_middleware)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We can find express middlewares on &lt;a href="http://expressjs.com/en/resources/middleware.html"&gt;the official doc&lt;/a&gt; or on NPM. We also may write our own middleware. The express doc has pages about &lt;a href="https://expressjs.com/en/guide/using-middleware.html"&gt;using&lt;/a&gt; and &lt;a href="http://expressjs.com/en/guide/writing-middleware.html"&gt;writing&lt;/a&gt; them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Describe error handling in Express.
&lt;/h1&gt;

&lt;p&gt;Express comes with a default build-in error middleware: any error occurring in synchronous code will be catch. For async functions, we can pass the error object to &lt;code&gt;next()&lt;/code&gt;. Then the error stack will be sent to the client (if we're not in production env).&lt;/p&gt;

&lt;p&gt;Customs error middleware &lt;strong&gt;must&lt;/strong&gt; take four arguments to preserve signature and get the &lt;code&gt;error&lt;/code&gt; object as first parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/02-handle-errors.js&lt;/span&gt;

&lt;span class="nx"&gt;app&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="kd"&gt;function&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;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="nx"&gt;stack&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;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something wrong!&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;Custom handlers must be placed at the end of the middleware list, after all other &lt;code&gt;app.use()&lt;/code&gt; or route handlers to be sure to get all potential errors.&lt;/p&gt;

&lt;p&gt;Express &lt;a href="https://expressjs.com/en/guide/error-handling.html"&gt;error handling page&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Describe what the main parts of an Express app might look like.
&lt;/h1&gt;

&lt;p&gt;It really depends on the purpose of our app. Modules may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;settings: network options, middlewares...&lt;/li&gt;
&lt;li&gt;routes handlers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://expressjs.com/en/guide/database-integration.html"&gt;database&lt;/a&gt; write/access&lt;/li&gt;
&lt;li&gt;[views engines](&lt;a href="https://expressjs.com/en/resources/template-engines.html()"&gt;https://expressjs.com/en/resources/template-engines.html()&lt;/a&gt; (templates)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Express seems very solid and well documented. It's flexibility makes it a good choice for most off the apps. Many fonctions have to be added by third party modules (databases, views engines...), and it can be a time-consuming to make the good choice. Fortunately there's plentiful of articles and docs about them because of express popularity.&lt;/p&gt;

</description>
      <category>node</category>
      <category>todayilearned</category>
      <category>express</category>
    </item>
    <item>
      <title>How we reached react devs among our users</title>
      <dc:creator>Camille Gabrieli</dc:creator>
      <pubDate>Fri, 18 Sep 2020 13:29:01 +0000</pubDate>
      <link>https://forem.com/aziaziazi/how-we-reached-react-devs-among-our-users-iia</link>
      <guid>https://forem.com/aziaziazi/how-we-reached-react-devs-among-our-users-iia</guid>
      <description>&lt;p&gt;&lt;em&gt;tldr: devtools globals variables let you guess if your user has a React debugger installed&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Last year my team was striving to find React developers to join us and happily translate fancy product team ideas into JavaScript. With a few million happy users per week, some of our users may be a good fit for our team! Did they know we hire? Probably not! Our career page was accessible by a tiny link between press and affiliation at the bottom of the unlogged home page. And indeed our product was so captivating that they were probably too busy using the app to think about career aspirations! Still we didn't want show a career message to everyone as it would be irrelevant for most of them.&lt;/p&gt;

&lt;h1&gt;
  
  
  🧑‍💻 Method
&lt;/h1&gt;

&lt;p&gt;While performing delightful debugging session, &lt;a href="//twitter.com/NicolasCordin"&gt;Nicolas&lt;/a&gt; and myself came with this idea: as &lt;a href="https://www.npmjs.com/package/react-devtools"&gt;React devtools plugin&lt;/a&gt; exposes a global variable, we can use it to know if a user has installed it and toggle a message !&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When the page loads, the devtools sets a global named &lt;code&gt;__REACT_DEVTOOLS_GLOBAL_HOOK__&lt;/code&gt;, then React communicates with that hook during initialization.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Easy ! Let's try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/hello-react-dev.js&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__REACT_DEVTOOLS_GLOBAL_HOOK__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;Hello React 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;We can also detect any other dev plugin that exposes some variables. We came with &lt;code&gt;__REDUX_DEVTOOLS_EXTENSION__&lt;/code&gt; and &lt;code&gt;__VUE_DEVTOOLS_GLOBAL_HOOK__&lt;/code&gt;, let me know if you know more!&lt;/p&gt;

&lt;p&gt;We also need a way to close the message and persist the information to avoid displaying it again. Let's wrap this in a component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/dev-message.jsx&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCookies&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-cookie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DevMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Store if user has already closed the message&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCookie&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useCookies&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;cookieName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hasClosedDevMessage&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;hasClosedDevMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cookieName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&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;handleClose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setCookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cookieName&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;// Check what plugins are installed&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userPluginNames&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__REACT_DEVTOOLS_GLOBAL_HOOK__&lt;/span&gt;&lt;span class="p"&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;redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__REDUX_DEVTOOLS_EXTENSION__&lt;/span&gt;&lt;span class="p"&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;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__VUE_DEVTOOLS_GLOBAL_HOOK__&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;filter&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="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&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;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&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="c1"&gt;// Only display the message if user has a plugins installed&lt;/span&gt;
  &lt;span class="c1"&gt;// and if s.he didn't close the message yet&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;hasClosedDevMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reset your cookies to see the message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;userPluginNames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;install a plugin to see the message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userPluginNames&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; Dev !&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://youtu.be/dQw4w9WgXcQ"&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      interested ?
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClose&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;no thanks&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&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;And that's it ! You can &lt;a href="https://dev-message.aziaziazi.repl.co/"&gt;try it live here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-message.aziaziazi.repl.co/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pkIUlgMv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vl9mesxa4u9d69bobetm.png" alt="live exemple screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🕵️ Others techniques
&lt;/h1&gt;

&lt;p&gt;With React, Redux and Vue plugins we target a precise but narrow field of developers. Others methods may be inspired by &lt;a href="https://blog.mozilla.org/internetcitizen/2018/07/26/this-is-your-digital-fingerprint/"&gt;fingerprinting&lt;/a&gt; techniques :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/fijiwebdesign/3b0bf8e88ceef7518844"&gt;Detect available fonts&lt;/a&gt; used by developer: if you have &lt;a href="https://github.com/tonsky/FiraCode"&gt;FiraCode&lt;/a&gt; or &lt;a href="https://www.jetbrains.com/lp/mono/"&gt;Jetbrains Mono&lt;/a&gt; installed on your machine, there's a good chance it's for your IDE!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uber "&lt;a href="https://slate.com/technology/2016/03/uber-s-code-on-the-road-hacker-challenge-scouts-for-new-employees.html"&gt;Code on the Road&lt;/a&gt;" seems to only use you location to propose you a test during you ride.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google uses it's own data -your search history- to propose you to pass the &lt;a href="https://medium.com/plutonic-services/things-you-should-know-about-google-foobar-invitation-703a535bf30f"&gt;foo.bar challenge&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You may look for for Github, Stack Overflow, docs references... in the navigation history. Not sure if that's legal or not, I wouldn't recommend you to do that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Last but not least: &lt;a href="http://console.love/"&gt;console.log messages&lt;/a&gt;. I like the fact that it's logged for everyone but only the curious will see it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🕶️ Privacy concern
&lt;/h1&gt;

&lt;p&gt;As long as the cookie is anonymous and stays on the user machine it seems fine: looking for someone's global variables is quite similar to approaching him/her in the street to compliment his/her cool webpack t-shirt.&lt;/p&gt;

&lt;h1&gt;
  
  
  🥳 Did it work ?
&lt;/h1&gt;

&lt;p&gt;Kind of: with around 1.5 click/day the exposure seems sufficient to keep the experiment going. And we did receive a candidacy from it!&lt;/p&gt;

&lt;p&gt;The approach I shared here with you is fairly simple. However I think it's always nice to think about new original ways to take advantage of the tools we use every day. Hope it gave you some inspiration!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>career</category>
    </item>
    <item>
      <title>Create a simple Node server with http, url and fs</title>
      <dc:creator>Camille Gabrieli</dc:creator>
      <pubDate>Tue, 15 Sep 2020 16:32:44 +0000</pubDate>
      <link>https://forem.com/aziaziazi/learn-nodejs-day-1-eao</link>
      <guid>https://forem.com/aziaziazi/learn-nodejs-day-1-eao</guid>
      <description>&lt;h1&gt;
  
  
  Minimal server
&lt;/h1&gt;

&lt;p&gt;Continuing my journey through the &lt;a href="https://www.theodinproject.com/courses/nodejs"&gt;Odin Project&lt;/a&gt;, I go along w3school NodeJS introduction. Here's a minimal server that return "Hello Node!" to localhost:8080:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/01-minimal-server.js&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;http&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;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;http&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&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;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="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;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&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;Content-Type&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;text/html&lt;/span&gt;&lt;span class="dl"&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;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello Node!&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Modules
&lt;/h1&gt;

&lt;p&gt;We can also create our own &lt;strong&gt;modules&lt;/strong&gt; using the &lt;code&gt;exports&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/01-exports-module.js&lt;/span&gt;

&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;myDateTime&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Date&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 &lt;strong&gt;FileStystem&lt;/strong&gt; module &lt;code&gt;fs&lt;/code&gt; includes methods to work with files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt; a file on the system: &lt;code&gt;fs.readFile('file.html', (err, data) =&amp;gt; {...})&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt; a file with &lt;code&gt;appendFile&lt;/code&gt;, &lt;code&gt;open&lt;/code&gt; (with &lt;code&gt;w&lt;/code&gt; flag) or &lt;code&gt;writeFile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt; a file with &lt;code&gt;appendFile&lt;/code&gt; or &lt;code&gt;writeFile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete&lt;/strong&gt; a file with &lt;code&gt;unlink&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rename&lt;/strong&gt; a file with &lt;code&gt;rename&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;url&lt;/strong&gt; module helps to retrieve url's parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/01-url-module.js&lt;/span&gt;

&lt;span class="kd"&gt;var&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;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;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;adr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8080/default.html?year=2017&amp;amp;month=february&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;q&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;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;adr&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;console&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="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//returns 'localhost:8080'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//returns '/default.html'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//returns '?year=2017&amp;amp;month=february'&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;qdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//returns an object: { year: 2017, month: 'february' }&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;qdata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;month&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//returns 'february'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We may use the modules &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;fs&lt;/code&gt; to serve specific files depending on path the user navigates to.&lt;/p&gt;

&lt;p&gt;We can use &lt;strong&gt;npm&lt;/strong&gt; the same way as in front end: &lt;code&gt;npm i module-name&lt;/code&gt; and then use is with &lt;code&gt;var module = require('module-name')&lt;/code&gt;. Here's two useful modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[formidale][&lt;a href="https://www.npmjs.com/package/formidable"&gt;https://www.npmjs.com/package/formidable&lt;/a&gt;] to parse file upload&lt;/li&gt;
&lt;li&gt;[nodemailer][&lt;a href="https://www.npmjs.com/package/nodemailer"&gt;https://www.npmjs.com/package/nodemailer&lt;/a&gt;] to send emails&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Events
&lt;/h1&gt;

&lt;p&gt;Node is &lt;strong&gt;perfect&lt;/strong&gt; for event-driven application ! Every action is an event, like a when a connection is made, or a file opened. Some objects can fire events, like &lt;code&gt;readStream&lt;/code&gt; that listen for opening or closing a file: &lt;code&gt;fs.createReadStream('./file.txt').on('open', () =&amp;gt; {...})&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then module &lt;code&gt;events&lt;/code&gt; let us create, fire and listen for our own events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/01-events-module.js&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;events&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;events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;customEvent&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;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// handler&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;handleNodeLearned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&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;Congrats, you learned Node!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// listener&lt;/span&gt;
&lt;span class="nx"&gt;customEvent&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;nodeLearned&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleNodeLearned&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// fire events with emit()&lt;/span&gt;
&lt;span class="nx"&gt;customEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nodeLearned&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Simple Site
&lt;/h1&gt;

&lt;p&gt;The assignment is to create a simple site with and index, two pages, and a 404-page handler. Here's the server and index page, and you'll find the &lt;a href="https://github.com/aziaziazi/my-dev.to-posts/tree/master/posts/learn-node/code/01-simple-site/"&gt;full code here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code/01-simple-site/index.js&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;http&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;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;var&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;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;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fs&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;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;writeAndEnd&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;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="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;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;http&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pathname&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;parse&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;url&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;pathname&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;pathname&lt;/span&gt; &lt;span class="o"&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="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// handle root path&lt;/span&gt;

    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="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="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;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&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;Content-Type&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;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;404.html&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="nx"&gt;data&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="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;writeAndEnd&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;404 not handled :(&lt;/span&gt;&lt;span class="dl"&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;writeAndEnd&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;data&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;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&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;Content-Type&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;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="nx"&gt;writeAndEnd&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;data&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!--code/01-simple-site/index.html--&amp;gt;&lt;/span&gt;

&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Simple Site&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Welcome to the Simple Site&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      You may navigate to the
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/about.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;about&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      or
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/contact.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      pages. You also may try others routes:
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;onsubmit=&lt;/span&gt;&lt;span class="s"&gt;"window.location.href = event.target[0].value; return false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Go !&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>node</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>Introduction and background</title>
      <dc:creator>Camille Gabrieli</dc:creator>
      <pubDate>Tue, 15 Sep 2020 16:07:43 +0000</pubDate>
      <link>https://forem.com/aziaziazi/learn-nodejs-day-0-4fc3</link>
      <guid>https://forem.com/aziaziazi/learn-nodejs-day-0-4fc3</guid>
      <description>&lt;p&gt;Today I started Odin's &lt;a href="https://www.theodinproject.com/courses/nodejs"&gt;Node-js course&lt;/a&gt;. My company is very enthusiastic about self training and propose a curated list of courses to learn and practice different technologies. I choose NodeJS because as I'm already proficient with JS, I will be able to give more focus on good practice than syntax details.&lt;/p&gt;

&lt;p&gt;Here I will log my learnings through it. The incentives to make it public are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defeat timidity! I'm not used to publicly posting on the web and doing so is already a big step for me!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Learning_by_teaching#:~:text=In%20the%20field%20of%20pedagogy,along%20with%20the%20subject%20matter."&gt;Learn by teaching&lt;/a&gt;: trying to re-explain what's just digested may benefit the memorization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dive in 🤿 !&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;NodeJS exist since &lt;strong&gt;2009&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It's a &lt;strong&gt;JavaScript runtime&lt;/strong&gt;: it runs on a local machine, contrary to JavaScript that runs in a browser. in the background I guess Node is running in a virtual machine as JS does in the browser.&lt;/li&gt;
&lt;li&gt;It's &lt;strong&gt;asynchronous event driven&lt;/strong&gt;: the lines of code won't necessarily execute in order. Instead, we write functions that gets called by events such as network request or callbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Event Driven
&lt;/h1&gt;

&lt;p&gt;Let's say I want an app that tell me if I forgot my umbrella. The steps are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;fetch the weather forecast&lt;/li&gt;
&lt;li&gt;if it's sunny, stop&lt;/li&gt;
&lt;li&gt;check in my database "backpack" if I already got the umbrella&lt;/li&gt;
&lt;li&gt;If I got it, stop&lt;/li&gt;
&lt;li&gt;Remind me to take the umbrella&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's two asynchronous process here: fetching the forecast and checking the DB. If I run the steps one by one the program will work. However, we can make it quicker by executing several actions at the same time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;fetch the forecast THEN if it's sunny, stop&lt;/li&gt;
&lt;li&gt;check the database THEN if umbrella is there, stop&lt;/li&gt;
&lt;li&gt;THEN is it's not sunny, and if I don't have the umbrella, remind me to take it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That way, we stop the program (or pass to the next action) as soon as we got the first response from the forecast or DB. While both actions are running (fetch &amp;amp; query), node waits on an &lt;strong&gt;event&lt;/strong&gt;, here the completion of fetch/query. This process is close to the usage of &lt;code&gt;addEventListener&lt;/code&gt; in frontend, but instead of waiting for mouse click, our events will mostly be network requests and DB query.&lt;/p&gt;

&lt;p&gt;To handle events, we'll use &lt;a href="https://briggs.dev/blog/understanding-callbacks"&gt;callbacks&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A callback is a function pass to another function as argument.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many fonctions uses callback, even &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;forEach&lt;/code&gt; : &lt;code&gt;[1, 2, 3].forEach(n =&amp;gt; console.log(n)&lt;/code&gt;. Event listeners uses callback the same way: &lt;code&gt;element.addEventListener('click', console.log)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's an exemple of callback usage in NodeJS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;http&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&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;Content-Type&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;text/html&lt;/span&gt;&lt;span class="dl"&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;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello Node!&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Assignment: Read &amp;amp; Watch
&lt;/h1&gt;

&lt;h2&gt;
  
  
  NodeJS website
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps"&gt;nodejs.org&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Blocking vs not-blocking
&lt;/h4&gt;

&lt;p&gt;During my navigation of the site, I encountered &lt;a href="https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/"&gt;blocking vs non blocking&lt;/a&gt; page that triggered my curiosity because it mentions methods whose names end with &lt;code&gt;Sync&lt;/code&gt;. That might be in relationship with the "Event Driven" section above, so I kept on reading:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Blocking methods execute synchronously and non-blocking methods execute asynchronously.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;fs&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;fs&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/file.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1. blocks the process until the file is read&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2. called after data read&lt;/span&gt;
&lt;span class="nx"&gt;nextMethod&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 3. called after console.log&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/file.md&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="nx"&gt;data&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;// 1. async method, do not block the process !&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;throw&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;console&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 3. console when 1. resolved&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;nextMethod&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 2. called without waiting completion of 1.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Blocking methods&lt;/strong&gt; execute synchronously and will block the execution until resolved. If there is an error, the error need to be caught, or the process will crash.&lt;br&gt;
&lt;strong&gt;Non-Blocking methods&lt;/strong&gt; execute asynchronously and will not block the execution. Usually a callback can be passed to execute others operation after resolution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8ySrLbQn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/aziaziazi/my-dev.to-posts/master/posts/learn-node/assets/blockingnonblocking.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8ySrLbQn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/aziaziazi/my-dev.to-posts/master/posts/learn-node/assets/blockingnonblocking.png" alt="blocking vs non blocking"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NodeJS is &lt;strong&gt;single threaded&lt;/strong&gt;, therefore concurrent process refers to the event loop. Let's consider a server receiving multiple requests, and the request handler performing timely I/O operation on a database. Using blocking methods would handle the request one by one, delaying resolution of later requests. Using non-blocking methods however will let the server handle others requests while the I/O operation are in progress. This may lead to huge performance difference.&lt;/p&gt;

&lt;p&gt;Beware of mixing sync and async methods ! The next exemple will cause errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/file.md&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="nx"&gt;data&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;// 1. start reading file.md&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;throw&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;// 3. crash ! can't read data as the file has been deleted whild reading it.&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unlinkSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/file.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2. delete file.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Placing non-blocking call inside callback guarantees a safer order of operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/file.md&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="nx"&gt;data&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;// 1. start reading file.md&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;throw&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;console&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2. log data&lt;/span&gt;
  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unlink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/file.md&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 3. start removing file&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;throw&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;// handle error if necessary&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  MDN server-side introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/First_steps"&gt;MDN&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  HTTP
&lt;/h4&gt;

&lt;p&gt;Http is the protocol used to transfer hypertext (linked web documents) between two computers (client &amp;amp; server). It is &lt;strong&gt;textual&lt;/strong&gt; (all commands are plain text ad human readable) and &lt;strong&gt;stateless&lt;/strong&gt;: Neither the client not the server keeps states of the previous exchanges. Only clients can make an HTTP request, and the server can respond to it. Servers &lt;em&gt;must&lt;/em&gt; answer every http request, at least with an error message!&lt;/p&gt;

&lt;h4&gt;
  
  
  Static vs Dynamic
&lt;/h4&gt;

&lt;p&gt;A static site always deliver the same content whenever a ressource is requested. Gatsby's sites are static: they're build and stored in the server, then sent as it is.&lt;/p&gt;

&lt;p&gt;Dynamic sites are generated on-demand, usually inserting data from a DB into a template. The server can adapt the content based on user preferences sent in the request or already stored in a DB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q3MzZ8Z9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/aziaziazi/my-dev.to-posts/master/posts/learn-node/assets/dynamic-server.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q3MzZ8Z9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/aziaziazi/my-dev.to-posts/master/posts/learn-node/assets/dynamic-server.png" alt="dynamic server"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefits
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Efficient storage and delivery&lt;/strong&gt;: storing large amount of data like amazon's products or facebook posts will be way more efficient in a database than in individual webpages. A server can access this database and return constructed web pages (html) or data (json). ex: Amazon result's and product's pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customize user experience&lt;/strong&gt;: the server can store user's information like credit cards detail, search history or habits. ex: google auto-complete uses previous search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Control access&lt;/strong&gt;: control who can view, edit, delete... information. This can be the user but also other servers. ex: bank website needs you to be logged to view your account information or edit your password. The bank itself can edit your accounts balance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store session/state information&lt;/strong&gt;: the server can &lt;em&gt;remember&lt;/em&gt; the current user of a site and adapt it's response. ex: a newspaper asking you to subscribe after n pages views.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notification &amp;amp; communication&lt;/strong&gt;: servers can send emails, sms, push notifications... but also live messaging and video conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data analysis&lt;/strong&gt;: we may collect lot of data about our user and use them. ex: facebook news feed or advertising.&lt;/p&gt;

&lt;h4&gt;
  
  
  Web Frameworks
&lt;/h4&gt;

&lt;p&gt;Framework handles common operations we often need to repeat for apps:&lt;/p&gt;

&lt;p&gt;Easily &lt;strong&gt;Mapping urls&lt;/strong&gt; for ressources/pages to handler functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.conf.urls&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;

&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r'^$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         &lt;span class="c1"&gt;# example: /best/
&lt;/span&gt;   &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r'^junior/$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;junior&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# example: /best/junior/
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Filling html &lt;strong&gt;templates&lt;/strong&gt; with filtered &lt;strong&gt;data from model&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.shortcuts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Team&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;junior&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;list_teams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Team&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;team_type__exact&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"junior"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'list'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;list_teams&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'best/index.html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt;&lt;/strong&gt; is an extremely popular node framework. It is fast, unopinionated, flexible, providing utilities for web apps and http requests. It is minimalist: some functionalities (DB access, user restrictions) might be loaded from libraries or others frameworks based on express.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://deno.land/"&gt;Deno&lt;/a&gt;&lt;/strong&gt; is a simple, modern and secure JS/TS runtime and framework build with V8 and Rust. It tries to fix some problems with node: security, formating, modules versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freecodecamp introduction to Node
&lt;/h2&gt;

&lt;p&gt;Freecodecamp &lt;a href="https://www.freecodecamp.org/news/what-exactly-is-node-js-ae36e97449f5/"&gt;article&lt;/a&gt; and the linked video explaining clearly (!) the event loop:&lt;/p&gt;

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

&lt;p&gt;The speaker uses a tool he creates to display the current state of call stack, web apis, callback queue and render queue: &lt;a href="http://latentflip.com/loupe/"&gt;Loupe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.sessionstack.com/how-javascript-works-event-loop-and-the-rise-of-async-programming-5-ways-to-better-coding-with-2f077c4438b5"&gt;This&lt;/a&gt; is a more in depth article about event loop and asynchronous execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemple of application
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.teamtreehouse.com/7-awesome-things-can-build-node-js"&gt;7 things&lt;/a&gt; I can build with NodeJS. Those are all interesting and real projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://chat.meatspac.es/"&gt;Gif chat room&lt;/a&gt; :D&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chalkers/extremely_remote_controlled_car"&gt;Remote control a car&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We play pokemon (as twitch does !)&lt;/li&gt;
&lt;li&gt;Remote control computer&lt;/li&gt;
&lt;li&gt;Build a hangout-like website&lt;/li&gt;
&lt;li&gt;Collaborative drawing tool&lt;/li&gt;
&lt;li&gt;Desktop RSS reader&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Odin course start with the elementary notions. As I'm self trained and did not have CS academic, my learning sometimes jumped back and forth in complexity. Now I'm very happy to review the ordered basics!&lt;/p&gt;

</description>
      <category>node</category>
      <category>todayilearned</category>
    </item>
  </channel>
</rss>
