node.js
#assembler-school
#master-in-software-engineering
In this workshop you will learn how to build backend apps with Node.js.
- Getting Started
- Contents and Branches Naming Strategy
- Workshop Material
- What is Node.js?
- Our First Node App
- nodemon
- Modules in Node.js
- How Modules are Loaded
First, you will need to clone the repo:
$ git clone https://github.com/assembler-school/nodejs-intro-workshop.git
Before we can get started you will need to make sure that all the necessary dependencies are installed in your system. For this project we need Node.js. You can install it by following the instructions in the official docs (we recommend that you install the version that is named Current).
To verify that you have installed it correctly, you can run the following command from the terminal that should output the version installed:
$ node --version
v15.5.0
Then, you will have to install all the project dependencies with npm in the root folder:
$ npm install
The repository is made up of several branches that include the contents and exercises of each section.
The branches follow a naming strategy like the following:
{NN}-exercise
: includes the main contents and the instructions of the exercises{NN}-exercise-solution
: includes the solution of the exercises
In order to fetch all the remote branches in the repository you can use the following command:
$ git fetch --all
# List both remote-tracking branches and local branches
$ git branch --all
Then, you can create a local branch based on a remote branch with the following command:
$ git checkout -b <new_branch_name> <remote_branch_name>
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Node.js allows us to easily develop network applications such as web servers, web scrapers, cli tools and more. It uses Chrome's V8 JavaScript engine to communicate with a library written in C called libuv
which is a multi-platform support library with a focus on asynchronous I/O that was primarily developed for use by Node.js, but it’s also used by other tools.
One of the main advantages of Node.js is that since it is written in JavaScript, many front end developers that are used to coding in JavaScript can easily transition to a more back end role to develop services such as apis or cli tools.
Since we can use Node.js to execute javascript, if you create a script you will then be able to run it using node.
Create a hello-world.js
inside the src/utils
folder with the following code:
console.log("hello-world from node.js");
And then run it with node:
$ node src/utils/hello-world.js
# it should output the following text
hello-world from node.js
The nodemon
package makes it possible to automatically reload your program when you modify any file in the source code. If you run a script using just node it won't pick up any new changes you made to the file. On the other hand, you if run it using nodemon, every time you save the file, nodemon will execute the script again with the latest changes.
To install it run:
# Installing nodemon globally
npm install -g nodemon
# Installing nodemon locally
npm install --save-dev nodemon
To use nodemon, we can either run it from the terminal or as an npm script.
Run nodemon from the terminal
$ nodemon script_name.js
Run nodemon as an npm script:
"scripts": {
"start": "nodemon script_name.js"
}
In programming, modules are self-contained units of functionality that can be shared and reused across projects.
They make our lives as developers easier, as we can use them to augment our applications with functionality that we haven’t had to write ourselves. They also allow us to organize and decouple our code, leading to applications that are easier to understand, debug and maintain.
Node.js by default uses CommonJS as its module system. In the latest versions we can also use ES Modules, but by default, all modules in Node.js will be imported using require('path-to-module')
and exported using module.exports = {}
.
If we want to use ES Modules with node we can either use Babel, a *.mjs
file extension or add the following entry in the package.json
file:
{
"type": "module"
}
Node.js provides the module.exports
interface to expose functions and variables to other files. The most simple way to do so is to export only one object (function or variable).
module.exports = function (subject) {
console.log("Hello " + subject);
};
Modules can also be declared outside of the module.exports
object and then referenced inside it.
// src/utils/first-modules.js
function hello(subject) {
console.log("Hello " + subject);
}
module.exports = { hello: hello };
Or we can declared the modules as methods of the exported object:
// src/utils/first-modules.js
module.exports = {
hello: function (subject) {
console.log("hello " + subject);
},
bye: function (subject) {
console.log("goodbye " + subject);
},
};
In order to import modules that we have created, we can use the require('/path')
method of node.js.
// src/utils/first-imports.js
const utils = require("./first-modules");
// { hello: [Function: hello], bye: [Function: bye] }
console.log(utils);
// hello Ana
utils.hello("Ana");
We can import both our own modules and ones built into node.js or those that we have installed with npm.
// import all the exported modules from utils.js
const utils = require("./utils");
// using destructuring to chose the modules we want
const { bye, hello } = require("./utils");
// importing built-in node modules
const http = require("http");
// importing modules from npm
const bcrypt = require("bcrypt");
Node.JS executes the module only the first time you require it. Any further require functions will re-use the same Object, loading it from the require cache, thus not executing the code in the module another time. This reduces the number of file reads and helps to speed up the application.
// not recommended, but it works
const bcrypt1 = require("http");
const bcrypt2 = require("http");
const bcrypt3 = require("http");
const bcrypt4 = require("http");
const bcrypt5 = require("http");
Modules can be required without using relative paths by putting them in a special directory called node_modules
. For example, to require a module called foo from a file index.js
, you can use the following directory structure:
index.js
└── node_modules
└── foo
├── foo.js
└── package.json
Modules should be placed inside a directory, along with a package.json
file. The main field of the package.json
file should point to the entry point for your module —this is the file that is imported when users execute require('your-module')
.
main
defaults to index.js
if not provided. Alternatively, you can refer to files relative to your module simply by appending the relative path to the require call: require('your-module/path/to/file')
.
If you installed Node using the default directory, while in the global mode, NPM installs packages into /usr/local/lib/node_modules
. If you type the following in the shell, NPM will search for, download, and install the latest version of the package named sax inside the directory /usr/local/lib/node_modules/express
$ npm install -g express
In local mode installation NPM will download and install modules in the current working folders by creating a new folder called node_modules
.
For example, if you are in /home/user/apps/my_app
a new folder will be created that is called node_modules
/home/user/apps/my_app/node_modules
if does not already exist.
$ npm install bcrypt
When we reference a module, if the module is not a core module of node.js, node will try to find it in the node_modules
folder of the current directory. If it doesn’t find it there, it will try to find it in the node_modules
folder of the parent directory, and so on, until it finds it or fails.
../node_modules/module.js
../../node_modules/module.js
../../../node_modules/module.js
Open the 01-exercise.js
file inside the src/exercises/01-exercise
folder and solve the exercise by following the instructions. Then, you can check if your solution is correct by running from the terminal the following command:
$ npm run test:ex:01
For this part you have 15 minutes to solve it. If you get stuck you can find the solution inside the 01-exercise-solution
branch. Once the time has passed the instructor will solve the exercise.