Autoplay
Autocomplete
Previous Lesson
Complete and Continue
NodeJS - The Complete Guide (MVC, REST APIs, GraphQL, Deno)
Getting Started
Introduction (1:55)
What is Node.js? (4:42)
Installing Node.js and Creating our First App (7:41)
Join our Online Learning Community
Understanding the Role & Usage of Node.js (7:32)
Course Outline (7:31)
How To Get The Most Out Of The Course (3:54)
Working with the REPL vs Using FIles (2:58)
Using the Attached Source Code
The Academind Pro Referral Program
Optional: JavaScript - A Quick Refresher
Module Introduction (1:36)
JavaScript in a Nutshell (2:35)
Refreshing the Core Syntax (4:34)
let & const (2:27)
Understanding Arrow Functions (5:17)
Working with Objects, Properties & Methods (3:19)
Arrays & Array Methods (4:16)
Arrays, Objects & Reference Types (2:13)
Understanding Spread & Rest Operators (6:40)
Destructuring (5:37)
Async Code & Promises (10:28)
Template Literals
Wrap Up (0:50)
Useful Resources & Links
Understanding the Basics
Module Introduction (1:50)
How The Web Works (4:11)
Creating a Node Server (13:22)
The Node Lifecycle & Event Loop (4:53)
Understanding Requests (3:10)
Sending Responses (5:37)
Controlling the Node.js Process
Routing Requests (5:48)
Redirecting Requests (4:10)
Parsing Request Bodies (11:12)
Understanding Event Driven Code Execution (6:00)
Blocking and Non-Blocking Code (5:04)
Node.js - Looking Behind the Scenes (12:01)
Using the Node Modules System (10:05)
Wrap Up (5:15)
Assignment - Basics (Problem) (2:32)
Assignment - Basics (Solution) (11:32)
Useful Resources & Links
Improved Development Workflow and Debugging
Module Introduction (0:40)
Understanding NPM Scripts (7:03)
Installing 3rd Party Packages (8:20)
Global Features vs Core Modules vs Third-Party Modules
Using Nodemon for Autorestarts (1:36)
Global & Local npmPackages
Understanding different Error Types (1:49)
Finding & Fixing Syntax Errors (3:10)
Dealing with Runtime Errors (2:47)
Logical Errors (6:32)
Using the Debugger (3:10)
Restarting the Debugger Automatically After Editing our App (6:21)
Changing Variables in the Debug Console (1:26)
Wrap Up (3:14)
Useful Resources & Links
Working with Express.js
Module Introduction (2:15)
What is Express.js? (3:43)
Installing Express.js (3:47)
Adding Middleware (5:13)
How Middleware Works (2:58)
Express.js - Looking Behind the Scenes (3:42)
Handling Different Routes (4:59)
Assignment - Express.js (Problem) (1:52)
Assignment - Express.js (Solution) (6:21)
Parsing Incoming Requests (8:00)
Limiting Middleware Execution to POST Requests (1:48)
Using Express Router (8:04)
Adding a 404 Error Page (2:30)
Filtering Paths (3:38)
Creating HTML Pages (5:09)
Serving HTML Pages (7:19)
Returning a 404 Page (2:00)
Using a Helper Function for Navigation (3:37)
Styling our Pages (13:58)
Serving Files Statically (7:49)
Assignment - Navigation (Problem) (1:11)
Assignment - Navigation (Solution) (8:32)
Wrap Up (3:36)
Useful Resources & Links
Working with Dynamic Content & Adding Templating Engines
Module Introduction (2:31)
Sharing Data Across Requests & Users (8:05)
Templating Engines - An Overview (4:40)
Installing & Implementing Pug (11:04)
Outputting Dynamic Content (11:02)
Converting HTML Files to Pug (5:55)
Adding a Layout (5:35)
Finishing the Pug Template (5:50)
Working with Handlebars (5:08)
Converting our Project to Handlebars (7:41)
Adding the Layout to Handlebars (8:41)
Working with EJS (8:19)
Working on the Layout with Partials (9:33)
Wrap Up (3:46)
Assignment - Templating Engines (Problem) (1:36)
Assignment - Templating Engines (Solution) (25:02)
Useful Resources & Links
The Model View Controller (MVC)
Module Introduction (0:52)
What is the MVC? (2:48)
Adding Controllers (9:20)
Finishing the Controllers (2:37)
Adding a Product Model (8:05)
Storing Data in Files Via the Model (9:39)
Fetching Data from Files Via the Model (3:55)
Refactoring the File Storage Code (4:25)
Wrap Up (2:15)
Useful Resources & Links
Optional: Enhancing the App
Module Introduction (1:21)
Creating the Shop Structure (5:34)
Working on the Navigation (2:49)
Registering the Routes (11:04)
Storing Product Data (5:15)
Displaying Product Data (3:02)
Editing & Deleting Products (4:47)
Adding Another Item (2:08)
Useful Resources & Links
Dynamic Routes & Advanced Models
Module Introduction (1:07)
Preparations (1:23)
Adding the Product ID to the Path (4:34)
Extracting Dynamic Params (4:32)
Loading Product Detail Data (4:52)
Rendering the Product Detail View (5:26)
Passing Data with POST Requests (7:19)
Adding a Cart Model (12:29)
Using Query Params (7:54)
Pre-Populating the Edit Product Page with Data (6:46)
Linking to the Edit Page (2:20)
Editing the Product Data (8:58)
Adding the Product-Delete Functionality (5:34)
Deleting Cart Items (8:11)
Displaying Cart Items on the Cart Page (8:45)
Deleting Cart Items (5:24)
Fixing a Delete Product Bug (1:31)
Wrap Up (1:46)
Useful Resources & Links
SQL Introduction
Module Introduction (1:33)
Choosing a Database (4:17)
NoSQL Introduction (4:20)
Comparing SQL and NoSQL (5:06)
Setting Up MySQL (7:16)
Connecting our App to the SQL Database (6:50)
Basic SQL & Creating a Table (4:07)
Retrieving Data (3:00)
Fetching Products (6:30)
Fetching Products - Time to Practice (1:04)
Inserting Data Into the Database (4:12)
Fetching a Single Product with the "where" Condition (2:57)
Wrap Up (1:24)
Useful Resources & Links
Understanding Sequelize
Module Introduction (1:26)
What is Sequelize? (2:35)
Connecting to the Database (3:57)
Defining a Model (5:47)
Syncing JS Definitions to the Database (4:29)
Inserting Data & Creating a Product (4:49)
Retrieving Data & Finding Products (3:01)
Getting a Single Product with the "where" Condition (4:30)
Fetching Admin Products (1:25)
Updating Products (5:18)
Deleting Products (2:48)
Creating a User Model (2:48)
Adding a One-To-Many Relationship (5:54)
Creating & Managing a Dummy User (6:01)
Using Magic Association Methods (3:42)
Fetching Related Products (2:46)
One-To-Many & Many-To-Many Relations (6:03)
Creating & Fetching a Cart (5:45)
Adding New Products to the Cart (6:42)
Adding Existing Products & Retrieving Cart Items (4:55)
Deleting Related Items & Deleting Cart Products (2:24)
Adding an Order Model (4:19)
Storing Cartitems as Orderitems (8:19)
Resetting the Cart & Fetching and Outputting Orders (9:53)
Wrap Up (1:49)
Useful Resources & Links
Working with NoSQL & Using MongoDB
Module Introduction (1:17)
What is MongoDB? (3:57)
Relations in NoSQL (3:58)
Setting Up MongoDB (4:48)
Installing the MongoDB Driver (7:01)
Creating the Database Connection (3:25)
Finishing the Database Connection (4:21)
Using the Database Connection (5:14)
Creating Products (2:08)
Understanding the MongoDB Compass (2:38)
Fetching All Products (4:34)
Fetching a Single Product (7:45)
Making the "Edit" & "Delete" Buttons Work Again (2:21)
Working on the Product Model to Edit our Product (7:14)
Finishing the "Update Product" Code (3:57)
One Note About Updating Products (1:46)
Deleting Products (3:30)
Fixing the "Add Product" Functionality (1:28)
Creating New Users (7:00)
Storing the User in our Database (5:40)
Working on Cart Items & Orders (7:13)
Adding the "Add to Cart" Functionality (6:14)
Storing Multiple Products in the Cart (7:01)
Displaying the Cart Items (9:20)
Fixing a Bug (1:02)
Deleting Cart Items (4:02)
Adding an Order (4:36)
Adding Relational Order Data (6:21)
Getting Orders (3:20)
Removing Deleted Items From the Cart (2:58)
Wrap Up (2:19)
Useful Resources & Links
Working with Mongoose
Module Introduction (1:23)
What is Mongoose? (2:04)
Connecting to the MongoDB Server with Mongoose (4:47)
Creating the Product Schema (6:01)
Saving Data Through Mongoose (6:10)
Fetching All Products (2:27)
Fetching a Single Product (1:24)
Updating Products (4:14)
Deleting Products (1:19)
Adding and Using a User Model (6:36)
Using Relations in Mongoose (3:44)
One Important Thing About Fetching Relations (3:53)
Working on the Shopping Cart (5:25)
Loading the Cart (5:12)
Deleting Cart Items (2:45)
Creating & Getting Orders (9:56)
Storing All Order Related Data (1:52)
Clearing the Cart After Storing an Order (1:59)
Getting & Displaying the Orders (3:40)
Wrap Up (1:37)
Useful Resources & Links
Sessions & Cookies
Module Introduction (0:45)
What is a Cookie? (1:58)
The Current Project Status (2:18)
Optional: Creating the Login Form (6:22)
Adding the Request Driven Login Solution (7:40)
Setting a Cookie (5:55)
Manipulating Cookies (1:58)
Configuring Cookies (5:43)
What is a Session? (2:58)
Initializing the Session Middleware (2:43)
Using the Session Middleware (4:14)
Using MongoDB to Store Sessions (5:59)
Sessions & Cookies - A Short Summary (1:53)
Assignment - Sessions & Cookies (Problem) (1:37)
Assignment - Sessions & Cookies (Solution) (7:24)
Deleting a Cookie (4:35)
Fixing Some Minor Bugs (4:27)
Making "Add to Cart" Work Again (6:45)
Two Tiny Improvements (3:11)
Wrap Up (3:43)
Useful Resources & Links
Adding Authentication
Module Introduction (1:22)
What is Authentication? (2:25)
How is Authentication Implemented? (2:05)
Our Updated Project Status (2:25)
Implementing an Authentication Flow (7:34)
Encrypting Passwords (4:36)
Adding a Tiny Code Improvement (1:21)
Adding the Signin Functionality (6:21)
Working on Route Protection (2:12)
Using Middleware to Protect Routes (4:38)
Understanding CSRF Attacks (3:23)
Using a CSRF Token (6:56)
Adding CSRF Protection (4:23)
Fixing the Order Button (1:16)
Providing User Feedback (7:10)
Optional: Styling Error Messages (3:32)
Finishing the Flash Messages (2:20)
Adding Additional Flash Messages (2:20)
Wrap Up (2:32)
Useful Resources & Links
Sending Emails
Module Introduction (0:46)
How Does Sending Emails Work? (1:33)
Using SendGrid (1:24)
Using Nodemailer to Send an Email (5:09)
Potential Limitation for Large Scale Apps (1:29)
Useful Resources & Links
Advanced Authentication
Module Introduction (0:42)
Resetting Passwords (3:03)
Implementing the Token Logic (7:41)
Creating the Token (1:27)
Creating the Reset Password Form (5:27)
Adding Logic to Update the Password (6:35)
Why we Need Authorization (1:58)
Adding Authorization (2:07)
Adding Protection to Post Actions (3:43)
Why Editing Fails (1:06)
Wrap Up (1:44)
Useful Resources & Links
Understanding Validation
Module Introduction (1:03)
Why Should We Use Validation? (2:28)
How to Validate Input? (4:04)
Setup & Basic Validation (10:44)
Using Validation Error Messages (2:11)
Built-In & Custom Validators (3:55)
More Validators (4:26)
Checking For Field Equality (3:14)
Adding Async Validation (4:46)
Assignment - Validation (Problem) (1:18)
Assignment - Validation (Solution) (4:45)
Keeping User Input (4:11)
Adding Conditional CSS Classes (5:29)
Adding Validation to Login (5:36)
Sanitizing Data (3:41)
Validating Product Addition (11:40)
Validating Product Editing (6:57)
Wrap Up (1:23)
Useful Resources & Links
Error Handling
Module Introduction (0:45)
Types of Errors & Error Handling (5:14)
Analyzing the Error Handling in the Current Project (2:22)
Errors - Some Theory (6:43)
Throwing Errors in Code (2:42)
Returning Error Pages (6:54)
Using the Express.js Error Handling Middleware (5:47)
Updating the App (3:09)
Using the Error Handling Middleware Correctly (4:54)
Status Codes (5:57)
Wrap Up (2:21)
Useful Resources & Links
File Upload & Download
Module Introduction (0:54)
Adding a File Picker to the Frontend (3:06)
Handling Multipart Form Data (5:15)
Handling File Uploads with Multer (4:51)
Configuring Multer to Adjust Filename & Filepath (4:29)
Filtering Files by Mimetype (2:28)
Storing File Data in the Database (7:42)
Serving Images Statically (4:25)
Downloading Files with Authentication (7:33)