Node.js is a runtime environment that allows for the execution of JavaScript code server-side, and it’s primarily used to build scalable network applications.
Node.js is an open-source, cross-platform, JavaScript runtime environment that executes JavaScript code outside of a web browser. Node.js is a popular, lightweight web framework for beginners, and it is used by many big companies like Netflix and Uber.
When we typically think of JavaScript, our mind tends to go to web development. Until Node.js came along, there was really no way to run JavaScript outside of a browser. When we write a backend server and database, Node.js is a popular choice because we can run our code as a standalone application rather than something that can only be evaluated in a browser environment.
Node.js is an important tool for any JavaScript developer to understand. So, today, we’ll introduce you to Node.js and show you how to get started with a project.
Today, we will cover:
Explore the inner workings and fundamentals of Node.js. By the end of this course, you will have an in-demand skill to add to your resume.
Learn Node.js: The Complete Course for Beginners
Node.js is an open-source, cross-platform JavaScript runtime environment used for executing JavaScript code outside of a web browser.
Node.js is a great web framework for beginners because it works great for data-intensive applications, like streaming and real-time apps, and Node.js makes it easy to start building the back-end.
Node.js allows us to use JavaScript everywhere and on any browser, including MacOS, Linux, and Windows. When we say everywhere, we mean the front-end, the middle-ware, and the back-end. Node.js is, therefore, part of some very popular web development stacks, such as the MERN stack, MEVN stack, and MEAN stack.
There are a number of characteristics that make Node.js what it is:
Now that we know what Node.js is, let’s explore the fundamentals of this tool.
The console is a module provided by Node.js that is akin to the JavaScript console in the browser when you inspect a webpage. The console has methods that are available for us to use for debugging purposes.
console.log()
: Frequently used to log some sort of output.console.warn()
: Explicitly delivers a warning to the console.console.error()
: Explicitly delivers an error message to the console. You can log an error as a string or as an object. If logged as a new Error()
, a traceback will be included as part of the message.console.trace()
: Logs a traceback when an error occurs in your code. Gives line number and column number of the file that the error probably occurred.At its core, the Buffer class in Node.js is a temporary storage solution for file systems. Due to its low-level nature, as web developers we will rarely actually use the Buffer class directly. The main purpose of this class is to allocate memory.
Let’s take a look at a few methods that the Buffer class provides.
const buf1 = Buffer.alloc(10);console.log(buf1);const buf2 = Buffer.alloc(5, 15);console.log(buf2);const buf3 = Buffer.allocUnsafe(10);console.log(buf3);buf3.fill(1);console.log(buf3);buf2.write("abcedf");console.log(buf2);const buf4 = Buffer.from([265, 6.5, -255, '7']);console.log(buf4);const buf5 = Buffer.from('Hello world');console.log(buf5);console.log(buf5.toString());
The file system (fs) module allows us to interact with files in Node.js. There are synchronous and asynchronous methods that can be used to read or write to a file using the fs module. In contrast to using console or the Buffer class, we need to import the fs module into the file that we would like to use in order to get it to work.
The code example below shows how the readFile
, an asynchronous method, works. Notice that the last argument in the method is a callback function whose first argument is an error. By definition this callback will always pass in the error first before the data.
Asynchronous Example:
The asynchronous nature of the readFile
method doesn’t block other functions or lines of code from running.
The synchronous method, readFileSync
, however, blocks other lines of code from running until the file is finished reading. Here’s an example:
const fs = require('fs')fs.readFile('data.txt', 'utf-8', (err, data) => {if (err) {console.error(err)return}let array = data.split('\n')//props are id, first_name, last_name, email, gender and ip_addresslet mapped = array.map(person => {let new_person = person.split(',');return new Object({id: new_person[0],first_name: new_person[1],last_name: new_person[2],email: new_person[3],gender: new_person[4],ip: new_person[5]})});console.log(mapped)});console.log("Hit!")
Synchronous Example:
1,Annabell,Cicconetti,acicconetti0@example.com,Female,219.207.16.22,Silvana,Glasman,sglasman1@house.gov,Female,233.214.135.183,Rebeka,Redmile,rredmile2@utexas.edu,Female,121.106.165.144,Veriee,Jovis,vjovis3@japanpost.jp,Female,43.217.63.1735,Melitta,Hanburry,mhanburry4@aboutads.info,Female,42.204.168.276,Alethea,Webben,awebben5@hatena.ne.jp,Female,189.126.43.497,Saxe,Leary,sleary6@behance.net,Male,95.156.25.218,Ario,Brabyn,abrabyn7@pcworld.com,Male,220.226.164.1769,Marybeth,Ughelli,mughelli8@mit.edu,Female,251.234.218.20710,Gothart,Tassell,gtassell9@freewebs.com,Male,247.146.121.23011,Fairlie,Beevis,fbeevisa@stanford.edu,Male,161.219.190.14812,Skippie,Station,sstationb@wikipedia.org,Male,178.184.167.11313,Ashla,Tett,atettc@nature.com,Female,209.125.39.16114,Belinda,Olin,bolind@discovery.com,Female,222.234.181.13415,Laurianne,Ledgerton,lledgertone@google.co.uk,Female,184.56.226.216,Angele,Rhodus,arhodusf@ca.gov,Female,112.66.128.2317,Meridith,Pena,mpenag@biblegateway.com,Female,163.227.38.12018,Romola,Erbe,rerbeh@networksolutions.com,Female,184.50.183.2519,Damien,Cominotti,dcominottii@naver.com,Male,122.62.139.5120,Lou,Clemerson,lclemersonj@sfgate.com,Female,176.117.18.8221,Donall,Lorence,dlorencek@shutterfly.com,Male,153.209.179.9022,Maribeth,Sloam,msloaml@cbslocal.com,Female,177.119.164.15623,Fowler,Pethybridge,fpethybridgem@vinaora.com,Male,58.228.162.24924,Jarred,Haxley,jhaxleyn@ox.ac.uk,Male,26.74.46.20025,Natalie,Outright,noutrighto@businessinsider.com,Female,181.218.16.21726,Cloe,Devitt,cdevittp@gmpg.org,Female,109.68.184.21127,Shane,Farmer,sfarmerq@ucsd.edu,Male,198.230.29.6928,Iorgo,Thrower,ithrowerr@nsw.gov.au,Male,103.213.212.7029,Letty,Dakhno,ldakhnos@pagesperso-orange.fr,Female,32.245.196.930,Woodrow,Flageul,wflageult@nsw.gov.au,Male,105.129.139.22031,Franchot,Large,flargeu@statcounter.com,Male,219.98.60.5132,Anna-diana,Callam,acallamv@51.la,Female,59.121.52.6933,Benoit,Scallon,bscallonw@etsy.com,Male,227.53.63.10334,Lavinie,Lovelady,lloveladyx@constantcontact.com,Female,227.20.131.19235,Timoteo,Laurentino,tlaurentinoy@techcrunch.com,Male,149.251.44.3036,Robers,Cassella,rcassellaz@google.pl,Male,179.219.60.19937,Arnoldo,Eakly,aeakly10@live.com,Male,189.110.238.2638,Janis,Didball,jdidball11@shinystat.com,Female,105.74.199.165
Try placing a console.log(“Hit!”)
after the function to see when the console is actually logged. Is there a difference between the two functions? What is it?
The readFile
function will start the function and then immediately move to the rest of the code before the function completes and prints out the contents of our array. So you should see something like:
Hit!
[
{
id: '1',
first_name: 'Annabell',
last_name: 'Cicconetti',
email: 'acicconetti0@example.com',
gender: 'Female',
ip: '219.207.16.2'
},
etc…
]
In contrast, the console.log(“Hit!”)
won’t run until after the readFileSync
function is finished:
[...{
id: '37',
first_name: 'Arnoldo',
last_name: 'Eakly',
email: 'aeakly10@live.com',
gender: 'Male',
ip: '189.110.238.26'
},
{
id: '38',
first_name: 'Janis',
last_name: 'Didball',
email: 'jdidball11@shinystat.com',
gender: 'Female',
ip: '105.74.199.165'
}
]
Hit!
Writing to files is done in a very similar fashion, but the functions are called writeFile()
and writeFileSync()
.
With Node.js, dealing with files is fairly simple to do with the fs module.
Learn Node.js without scrubbing through videos or documentation. Educative’s text-based courses are easy to skim and feature live coding environments, making learning quick and efficient.
Much of Node.js is built to be event-driven. When a user clicks on an interface or types in a form, an event is triggered to happen and then something occurs as a result. To attach a function or set of functions to a specific event is emitting an event.
These functions, called event listeners, are one part of an overall journey called the Event Loop. Take this example:
const EventEmitter = require('events');const emitter = new EventEmitter();const handleEvent = (str) => {console.log(`================ ${str}`);console.log("handleEvent fired! An event has happened!");console.log("end of event")}emitter.on('load event', () => handleEvent("load"));emitter.on('hello event', () => handleEvent("hello"));emitter.emit('load event');emitter.emit('hello event')
In this code example, we are importing the events module. Next, we create a new EventEmitter
and assign it to the variable emitter. In this particular example, we created a handleEvent
function that will serve as a callback function that will console.log some things.
The EventEmitter
class has several methods we can use. One method that is run when an event is emitted is the EventEmitter.on()
function.
This particular method will fire when an event is emitted. The first argument passed into the function is the name of the event and the second is the callback function that tells us how to handle the event.
In this particular example, there are two events being emitted. When we run the code above, we should get:
================ load
handleEvent fired! An event has happened!
end of event
================ hello
handleEvent fired! An event has happened!
end of event
true
The emit method triggers the on method which then invokes the handleEvent
callback function.
Global objects are available in every module, so they can be used without importing a specific module. The Buffer
class, for example, class is defined as a global in Node.js. Some other common global objects are:
console
object is used to print to stdout
and stderr
.setImmediate
, setInterval
, and setTimeout
, are also globals.process
object is also global.In a browser, the top-level scope is the global scope. But in Node.js, the top-level scope is not the global scope.
In Node.js, the global object can be used to see whatever is available in the global scope. Run the code below to see an example.
console.log(global)
Let’s learn how to get started with Node.js by creating a simply Node.js file.In this example, we will be setting up our computer to work as a server!
If you would like to learn how to create a Node.js app, please see Educative’s beginner course.
First, you need to Go to the site Node.js site and download the files.
Follow the installation prompts and restart your machine for best results.
Another way you can install Node.js is to use a package manager.
Then, test that it’s working by printing the version using the following command:
> node -v
You should also test npm by printing the version using the following command:
> npm -v
Once you have installed Node.js properly, create a Node.js file. In this example, we have named it named “first.js”. We then add the following code and save the file on your computer like so: C:\Users\Your Name\first.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello World!');
}).listen(8080);
This code is essentially telling the computer to print “Hello World!” when accessed on port 8080.
Node.js files must be initiated in your computer’s “Command Line Interface” program. Navigate to the folder that contains the file “first.js”.
C:\Users\Your Name>_
This file needs to then be initiated by Node.js. Do this by starting your command line interface, writing node first.js
, and clicking enter:
C:\Users\Your Name>node myfirst.js
Awesome! Now your computer is set up as a server, so when you accesses the computer on port 8080, the"Hello World!" message will print.
To see this in real time, open your browser, and type: http://localhost:8080
Congrats! You know the basics of Node.js, its fundamental tools, and how to start a Node.js file. The next steps are to master Node.js modules, the HTTP Modules, File system, and NPM dependencies.
A good next step would be to learn the following concepts of Node.js:
To get started with these advanced topics, check out Educative’s course Learn Node.js: The Complete Course For Beginners, which covers all these topics and more in detail. You’ll explore advanced concepts like modules, events, and packages. At the end of this course, you will get hands-on with Node.js and create your own food delivery web application.
Happy learning!
Free Resources