NodeJS - The Complete Guide (incl. Deno.js, REST APIs, GraphQL)

Master Node JS, build REST APIs with Node.js, GraphQL APIs, add Authentication, use MongoDB, SQL & much more!

Start

---

This course was updated to also include sections on Deno.js.

---

Node.js is probably THE most popular and modern server-side programming language you can dive into these days!

Node.js developers are in high demand and the language is used for everything from traditional web apps with server-side rendered views over REST APIs all the way up to GraphQL APIs and real-time web services. Not to mention its applications in build workflows for projects of all sizes.

This course will teach you all of that! From scratch with zero prior knowledge assumed. Though if you do bring some knowledge, you'll of course be able to quickly jump into the course modules that are most interesting to you.

Here's what you'll learn in this course:

  • Node.js Basics & Basic Core Modules
  • Parsing Requests & Sending Responses
  • Rendering HTML Dynamically (on the Server)
  • Using Express.js
  • Working with Files and generating PDFs on the Server (on-the-fly)
  • File Up- and Download
  • Using the Model-View-Controller (MVC) Pattern
  • Using Node.js with SQL (MySQL) and Sequelize
  • Using Node.js with NoSQL (MongoDB) and Mongoose
  • Working with Sessions & Cookies
  • User Authentication and Authorization
  • Sending E-Mails
  • Validating User Input
  • Data Pagination
  • Handling Payments with Stripe.js
  • Building REST APIs
  • Authentication in REST APIs
  • File Upload in REST APIs
  • Building GraphQL APIs
  • Authentication in GraphQL APIs
  • File Upload in GraphQL APIs
  • Building a Realtime Node.js App with Websockets
  • Automated Testing (Unit Tests)
  • Deploying a Node.js Application
  • And Way More!

Does this look like a lot of content? It certainly is!

This is not a short course but it is the "Complete Guide" on Node.js after all. We'll dive into a lot of topics and we'll not just scratch the surface.

We'll also not just walk through boring theory and some slides. Instead, we'll build two major projects: An online shop (including checkout + payments) and a blog.

All topics and features of the course will be shown and used in these projects and you'll therefore learn about them in a realistic environment.

Is this course for you?

If you got no Node.js experience, you'll love this course because it starts with zero knowledge assumed. It's the perfect course to become a Node.js developer.

If you got basic Node.js experience, this course is also a perfect match because you can go through the basic modules quickly and you'll benefit from all the deep dives and advanced topics the course covers.

Are you an advanced Node.js user ? Check the curriculum then. Maybe you found no other course that shows how to use SQL with Node.js. Or you're interested in GraphQL. Chances are, that you'll get a lot of value out of this course, too!

Section: Getting Started

1. Introduction (1:55) Preview
2. What is Node.js? (4:42) Preview
3. Installing Node.js and Creating our First App (7:41) Preview
4. Join our Online Learning Community (1:00) Preview
5. Understanding the Role & Usage of Node.js (7:32) Preview
6. Course Outline (7:31) Preview
7. How To Get The Most Out Of The Course (3:54) Preview
8. Working with the REPL vs Using FIles (2:58) Preview
9. Using the Attached Source Code (1:00) Preview

Section: Optional: JavaScript - A Quick Refresher

10. Module Introduction (1:36) Start
11. JavaScript in a Nutshell (2:35) Start
12. Refreshing the Core Syntax (4:34) Start
13. let & const (2:27) Start
14. Understanding Arrow Functions (5:17) Start
15. Working with Objects, Properties & Methods (3:19) Start
16. Arrays & Array Methods (4:16) Start
17. Arrays, Objects & Reference Types (2:13) Start
18. Understanding Spread & Rest Operators (6:40) Start
19. Destructuring (5:37) Start
20. Async Code & Promises (10:28) Start
21. Template Literals (1:00) Start
22. Wrap Up (0:50) Start
23. Useful Resources & Links (1:00) Start

Section: Understanding the Basics

24. Module Introduction (1:50) Start
25. How The Web Works (4:11) Preview
26. Creating a Node Server (13:22) Preview
27. The Node Lifecycle & Event Loop (4:53) Preview
28. Understanding Requests (3:10) Start
29. Sending Responses (5:37) Start
30. Controlling the Node.js Process (1:00) Start
31. Routing Requests (5:48) Start
32. Redirecting Requests (4:10) Start
33. Parsing Request Bodies (11:12) Start
34. Understanding Event Driven Code Execution (6:00) Start
35. Blocking and Non-Blocking Code (5:04) Start
36. Node.js - Looking Behind the Scenes (12:01) Start
37. Using the Node Modules System (10:05) Start
38. Wrap Up (5:15) Start
39. Assignment - Basics (Problem) (2:32) Start
40. Assignment - Basics (Solution) (11:32) Start
41. Useful Resources & Links (1:00) Start

Section: Improved Development Workflow and Debugging

42. Module Introduction (0:40) Start
43. Understanding NPM Scripts (7:03) Start
44. Installing 3rd Party Packages (8:20) Start
45. Global Features vs Core Modules vs Third-Party Modules (1:00) Start
46. Using Nodemon for Autorestarts (1:36) Start
47. Global & Local npmPackages (1:00) Start
48. Understanding different Error Types (1:49) Start
49. Finding & Fixing Syntax Errors (3:10) Start
50. Dealing with Runtime Errors (2:47) Start
51. Logical Errors (6:32) Start
52. Using the Debugger (3:10) Start
53. Restarting the Debugger Automatically After Editing our App (6:21) Start
54. Changing Variables in the Debug Console (1:26) Start
55. Wrap Up (3:14) Start
56. Useful Resources & Links (1:00) Start

Section: Working with Express.js

57. Module Introduction (2:15) Start
58. What is Express.js? (3:43) Start
59. Installing Express.js (3:47) Start
60. Adding Middleware (5:13) Start
61. How Middleware Works (2:58) Start
62. Express.js - Looking Behind the Scenes (3:42) Start
63. Handling Different Routes (4:59) Start
64. Assignment - Express.js (Problem) (1:52) Start
65. Assignment - Express.js (Solution) (6:21) Start
66. Parsing Incoming Requests (8:00) Start
67. Limiting Middleware Execution to POST Requests (1:48) Start
68. Using Express Router (8:04) Start
69. Adding a 404 Error Page (2:30) Start
70. Filtering Paths (3:38) Start
71. Creating HTML Pages (5:09) Start
72. Serving HTML Pages (7:19) Start
73. Returning a 404 Page (2:00) Start
74. Using a Helper Function for Navigation (3:37) Start
75. Styling our Pages (13:58) Start
76. Serving Files Statically (7:49) Start
77. Assignment - Navigation (Problem) (1:11) Start
78. Assignment - Navigation (Solution) (8:32) Start
79. Wrap Up (3:36) Start
80. Useful Resources & Links (1:00) Start

Section: Working with Dynamic Content & Adding Templating Engines

81. Module Introduction (2:31) Start
82. Sharing Data Across Requests & Users (8:05) Start
83. Templating Engines - An Overview (4:40) Start
84. Installing & Implementing Pug (11:04) Start
85. Outputting Dynamic Content (11:02) Start
86. Converting HTML Files to Pug (5:55) Start
87. Adding a Layout (5:35) Start
88. Finishing the Pug Template (5:50) Start
89. Working with Handlebars (5:08) Start
90. Converting our Project to Handlebars (7:41) Start
91. Adding the Layout to Handlebars (8:41) Start
92. Working with EJS (8:19) Start
93. Working on the Layout with Partials (9:33) Start
94. Wrap Up (3:46) Start
95. Assignment - Templating Engines (Problem) (1:36) Start
96. Assignment - Templating Engines (Solution) (25:02) Start
97. Useful Resources & Links (1:00) Start

Section: The Model View Controller (MVC)

98. Module Introduction (0:52) Start
99. What is the MVC? (2:48) Start
100. Adding Controllers (9:20) Start
101. Finishing the Controllers (2:37) Start
102. Adding a Product Model (8:05) Start
103. Storing Data in Files Via the Model (9:39) Start
104. Fetching Data from Files Via the Model (3:55) Start
105. Refactoring the File Storage Code (4:25) Start
106. Wrap Up (2:15) Start
107. Useful Resources & Links (1:00) Start

Section: Optional: Enhancing the App

108. Module Introduction (1:21) Start
109. Creating the Shop Structure (5:34) Start
110. Working on the Navigation (2:49) Start
111. Registering the Routes (11:04) Start
112. Storing Product Data (5:15) Start
113. Displaying Product Data (3:02) Start
114. Editing & Deleting Products (4:47) Start
115. Adding Another Item (2:08) Start
116. Useful Resources & Links (1:00) Start

Section: Dynamic Routes & Advanced Models

117. Module Introduction (1:07) Start
118. Preparations (1:23) Start
119. Adding the Product ID to the Path (4:34) Start
120. Extracting Dynamic Params (4:32) Start
121. Loading Product Detail Data (4:52) Start
122. Rendering the Product Detail View (5:26) Start
123. Passing Data with POST Requests (7:19) Start
124. Adding a Cart Model (12:29) Start
125. Using Query Params (7:54) Start
126. Pre-Populating the Edit Product Page with Data (6:46) Start
127. Linking to the Edit Page (2:20) Start
128. Editing the Product Data (8:58) Start
129. Adding the Product-Delete Functionality (5:34) Start
130. Deleting Cart Items (8:11) Start
131. Displaying Cart Items on the Cart Page (8:45) Start
132. Deleting Cart Items (5:24) Start
133. Fixing a Delete Product Bug (1:31) Start
134. Wrap Up (1:46) Start
135. Useful Resources & Links (1:00) Start

Section: SQL Introduction

136. Module Introduction (1:33) Start
137. Choosing a Database (4:17) Start
138. NoSQL Introduction (4:20) Start
139. Comparing SQL and NoSQL (5:06) Start
140. Setting Up MySQL (7:16) Start
141. Connecting our App to the SQL Database (6:50) Start
142. Basic SQL & Creating a Table (4:07) Start
143. Retrieving Data (3:00) Start
144. Fetching Products (6:30) Start
145. Fetching Products - Time to Practice (1:04) Start
146. Inserting Data Into the Database (4:12) Start
147. Fetching a Single Product with the "where" Condition (2:57) Start
148. Wrap Up (1:24) Start
149. Useful Resources & Links (1:00) Start

Section: Understanding Sequelize

150. Module Introduction (1:26) Start
151. What is Sequelize? (2:35) Start
152. Connecting to the Database (3:57) Start
153. Defining a Model (5:47) Start
154. Syncing JS Definitions to the Database (4:29) Start
155. Inserting Data & Creating a Product (4:49) Start
156. Retrieving Data & Finding Products (3:01) Start
157. Getting a Single Product with the "where" Condition (4:30) Start
158. Fetching Admin Products (1:25) Start
159. Updating Products (5:18) Start
160. Deleting Products (2:48) Start
161. Creating a User Model (2:48) Start
162. Adding a One-To-Many Relationship (5:54) Start
163. Creating & Managing a Dummy User (6:01) Start
164. Using Magic Association Methods (3:42) Start
165. Fetching Related Products (2:46) Start
166. One-To-Many & Many-To-Many Relations (6:03) Start
167. Creating & Fetching a Cart (5:45) Start
168. Adding New Products to the Cart (6:42) Start
169. Adding Existing Products & Retrieving Cart Items (4:55) Start
170. Deleting Related Items & Deleting Cart Products (2:24) Start
171. Adding an Order Model (4:19) Start
172. Storing Cartitems as Orderitems (8:19) Start
173. Resetting the Cart & Fetching and Outputting Orders (9:53) Start
174. Wrap Up (1:49) Start
175. Useful Resources & Links (1:00) Start

Section: Working with NoSQL & Using MongoDB

176. Module Introduction (1:17) Start
177. What is MongoDB? (3:57) Start
178. Relations in NoSQL (3:58) Start
179. Setting Up MongoDB (4:28) Start
180. Installing the MongoDB Driver (7:01) Start
181. Creating the Database Connection (3:25) Start
182. Finishing the Database Connection (4:21) Start
183. Using the Database Connection (5:14) Start
184. Creating Products (2:08) Start
185. Understanding the MongoDB Compass (2:38) Start
186. Fetching All Products (4:34) Start
187. Fetching a Single Product (7:45) Start
188. Making the "Edit" & "Delete" Buttons Work Again (2:21) Start
189. Working on the Product Model to Edit our Product (7:14) Start
190. Finishing the "Update Product" Code (3:57) Start
191. One Note About Updating Products (1:46) Start
192. Deleting Products (3:30) Start
193. Fixing the "Add Product" Functionality (1:28) Start
194. Creating New Users (7:00) Start
195. Storing the User in our Database (5:40) Start
196. Working on Cart Items & Orders (7:13) Start
197. Adding the "Add to Cart" Functionality (6:14) Start
198. Storing Multiple Products in the Cart (7:01) Start
199. Displaying the Cart Items (9:20) Start
200. Fixing a Bug (1:02) Start
201. Deleting Cart Items (4:02) Start
202. Adding an Order (4:36) Start
203. Adding Relational Order Data (6:21) Start
204. Getting Orders (3:20) Start
205. Removing Deleted Items From the Cart (2:58) Start
206. Wrap Up (2:19) Start
207. Useful Resources & Links (1:00) Start

Section: Working with Mongoose

208. Module Introduction (1:23) Start
209. What is Mongoose? (2:04) Start
210. Connecting to the MongoDB Server with Mongoose (4:47) Start
211. Creating the Product Schema (4:21) Start
212. Saving Data Through Mongoose (6:10) Start
213. Fetching All Products (2:27) Start
214. Fetching a Single Product (1:24) Start
215. Updating Products (4:14) Start
216. Deleting Products (1:19) Start
217. Adding and Using a User Model (6:36) Start
218. Using Relations in Mongoose (3:44) Start
219. One Important Thing About Fetching Relations (3:53) Start
220. Working on the Shopping Cart (5:25) Start
221. Loading the Cart (5:12) Start
222. Deleting Cart Items (2:45) Start
223. Creating & Getting Orders (9:56) Start
224. Storing All Order Related Data (1:52) Start
225. Clearing the Cart After Storing an Order (1:59) Start
226. Getting & Displaying the Orders (3:40) Start
227. Wrap Up (1:37) Start
228. Useful Resources & Links (1:00) Start

Section: Sessions & Cookies

229. Module Introduction (0:45) Start
230. What is a Cookie? (1:58) Start
231. The Current Project Status (2:18) Start
232. Optional: Creating the Login Form (6:22) Start
233. Adding the Request Driven Login Solution (7:40) Start
234. Setting a Cookie (5:55) Start
235. Manipulating Cookies (1:58) Start
236. Configuring Cookies (5:43) Start
237. What is a Session? (2:58) Start
238. Initializing the Session Middleware (2:43) Start
239. Using the Session Middleware (4:14) Start
240. Using MongoDB to Store Sessions (5:59) Start
241. Sessions & Cookies - A Short Summary (1:53) Start
242. Assignment - Sessions & Cookies (Problem) (1:37) Start
243. Assignment - Sessions & Cookies (Solution) (7:24) Start
244. Deleting a Cookie (4:35) Start
245. Fixing Some Minor Bugs (4:27) Start
246. Making "Add to Cart" Work Again (6:45) Start
247. Two Tiny Improvements (3:11) Start
248. Wrap Up (3:43) Start
249. Useful Resources & Links (1:00) Start

Section: Adding Authentication

250. Module Introduction (1:22) Start
251. What is Authentication? (2:25) Start
252. How is Authentication Implemented? (2:05) Start
253. Our Updated Project Status (2:25) Start
254. Implementing an Authentication Flow (7:34) Start
255. Encrypting Passwords (4:36) Start
256. Adding a Tiny Code Improvement (1:21) Start
257. Adding the Signin Functionality (6:21) Start
258. Working on Route Protection (2:12) Start
259. Using Middleware to Protect Routes (4:38) Start
260. Understanding CSRF Attacks (3:23) Start
261. Using a CSRF Token (6:56) Start
262. Adding CSRF Protection (4:23) Start
263. Fixing the Order Button (1:16) Start
264. Providing User Feedback (7:10) Start
265. Optional: Styling Error Messages (3:32) Start
266. Finishing the Flash Messages (2:20) Start
267. Adding Additional Flash Messages (2:20) Start
268. Wrap Up (2:32) Start
269. Useful Resources & Links (1:00) Start

Section: Sending Emails

270. Module Introduction (0:46) Start
271. How Does Sending Emails Work? (1:33) Start
272. Using SendGrid (1:24) Start
273. Using Nodemailer to Send an Email (5:09) Start
274. Potential Limitation for Large Scale Apps (1:29) Start
275. Useful Resources & Links (1:00) Start

Section: Advanced Authentication

276. Module Introduction (0:42) Start
277. Resetting Passwords (3:03) Start
278. Implementing the Token Logic (7:41) Start
279. Creating the Token (1:27) Start
280. Creating the Reset Password Form (5:27) Start
281. Adding Logic to Update the Password (6:35) Start
282. Why we Need Authorization (1:58) Start
283. Adding Authorization (2:07) Start
284. Adding Protection to Post Actions (3:43) Start
285. Why Editing Fails (1:06) Start
286. Wrap Up (1:44) Start
287. Useful Resources & Links (1:00) Start

Section: Understanding Validation

288. Module Introduction (1:03) Start
289. Why Should We Use Validation? (2:28) Start
290. How to Validate Input? (4:04) Start
291. Setup & Basic Validation (10:44) Start
292. Using Validation Error Messages (2:11) Start
293. Built-In & Custom Validators (3:55) Start
294. More Validators (4:26) Start
295. Checking For Field Equality (3:14) Start
296. Adding Async Validation (4:46) Start
297. Assignment - Validation (Problem) (1:18) Start
298. Assignment - Validation (Solution) (6:25) Start
299. Keeping User Input (4:11) Start
300. Adding Conditional CSS Classes (5:29) Start
301. Adding Validation to Login (5:36) Start
302. Sanitizing Data (3:41) Start
303. Validating Product Addition (11:40) Start
304. Validating Product Editing (6:57) Start
305. Wrap Up (1:23) Start
306. Useful Resources & Links (1:00) Start

Section: Error Handling

307. Module Introduction (0:45) Start
308. Types of Errors & Error Handling (5:14) Start
309. Analyzing the Error Handling in the Current Project (2:22) Start
310. Errors - Some Theory (6:43) Start
311. Throwing Errors in Code (2:42) Start
312. Returning Error Pages (6:54) Start
313. Using the Express.js Error Handling Middleware (5:47) Start
314. Updating the App (3:09) Start
315. Using the Error Handling Middleware Correctly (4:54) Start
316. Status Codes (5:57) Start
317. Wrap Up (2:21) Start
318. Useful Resources & Links (1:00) Start

Section: File Upload & Download

319. Module Introduction (0:54) Start
320. Adding a File Picker to the Frontend (3:06) Start
321. Handling Multipart Form Data (5:15) Start
322. Handling File Uploads with Multer (4:51) Start
323. Configuring Multer to Adjust Filename & Filepath (4:29) Start
324. Filtering Files by Mimetype (2:28) Start
325. Storing File Data in the Database (7:42) Start
326. Serving Images Statically (4:25) Start
327. Downloading Files with Authentication (7:33) Start
328. Setting File Type Headers (2:35) Start
329. Restricting File Access (3:19) Start
330. Streaming Data vs Preloading Data (3:20) Start
331. Using PDFKit for .pdf Generation (5:32) Start
332. Generating .pdf Files with Order Data (6:50) Start
333. Deleting Files (5:57) Start
334. Fixing Invoice Links (0:35) Start
335. Wrap Up (1:31) Start
336. Useful Resources & Links (1:00) Start

Section: Adding Pagination

337. Module Introduction (0:48) Start
338. Adding Pagination Links (4:08) Start
339. Retrieving a Chunk of Data (3:47) Start
340. Preparing Pagination Data on the Server (3:52) Start
341. Adding Dynamic Pagination Buttons (8:07) Start
342. Re-Using the Pagination Logic & Controls (3:41) Start
343. Wrap Up (1:02) Start
344. Useful Resources & Links (1:00) Start

Section: Understanding Async Requests

345. Module Introduction (0:49) Start
346. What are Async Requests? (2:07) Start
347. Adding Client Side JS Code (7:24) Start
348. Sending & Handling Background Requests (9:26) Start
349. Manipulating the DOM (3:01) Start
350. Useful Resources & Links (1:00) Start

Section: Adding Payments

351. Module Introduction (0:58) Start
352. How Payments Work (2:04) Start
353. Adding a Checkout Page (6:00) Start
354. Using Stripe in Your App (19:23) Start
355. Useful Resources & Links (1:00) Start

Section: Working with REST APIs - The Basics

356. Module Introduction (1:25) Start
357. What are REST APIs and why do we use Them? (7:01) Start
358. Accessing Data with REST APIs (5:41) Start
359. Understanding Routing & HTTP Methods (5:25) Start
360. REST APIs - The Core Principles (4:09) Start
361. Creating our REST API Project & Implementing the Route Setup (6:41) Start
362. Sending Requests & Responses and Working with Postman (13:28) Start
363. REST APIs, Clients & CORS Errors (10:33) Start
364. Sending POST Requests (6:32) Start
365. Wrap Up (2:14) Start
366. Useful Resources & Links (1:00) Start

Section: Working with REST APIs - The Practical Application

367. Module Introduction (1:10) Start
368. REST APIs & The Rest Of The Course (3:59) Start
369. Understanding the Frontend Setup (4:18) Start
370. Planning the API (3:02) Start
371. Fetching Lists of Posts (6:19) Start
372. Adding a Create Post Endpoint (7:36) Start
373. Adding Server Side Validation (6:19) Start
374. Setting Up a Post Model (5:14) Start
375. Storing Posts in the Database (3:32) Start
376. Static Images & Error Handling (6:53) Start
377. Fetching a Single Post (7:48) Start
378. Uploading Images (8:56) Start
379. Updating Posts (14:02) Start
380. Deleting Posts (4:17) Start
381. Adding Pagination (6:20) Start
382. Adding a User Model (4:08) Start
383. Adding User Signup Validation (6:29) Start
384. Signing Users Up (7:24) Start
385. How Does Authentication Work? (3:10) Start
386. Starting with User Login (3:51) Start
387. Logging In & Creating JSON Web Tokens (JWTs) (7:53) Start
388. Using & Validating the Token (9:43) Start
389. Adding Auth Middleware to All Routes (1:52) Start
390. Connecting Posts & Users (6:13) Start
391. Adding Authorization Checks (3:50) Start
392. Clearing Post-User Relations (2:54) Start
393. Assignment - REST API (Problem) (0:59) Start
394. Assignment - REST API (Solution) (8:16) Start
395. Wrap Up (2:28) Start
396. Useful Resources & Links (1:00) Start

Section: Understanding Async Await in Node.js

397. Module Introduction (0:58) Start
398. What is Async Await All About? (4:08) Start
399. Transforming "Then Catch" to "Async Await" (4:26) Start
400. Assignment - Async Await (Problem) (0:39) Start
401. Assignment - Async Await (Solution) (9:56) Start
402. Wrap Up (3:03) Start
403. Useful Resources & Links (1:00) Start

Section: Understanding Websockets & Socket.io

404. Module Introduction (0:55) Start
405. What Are Websockets & Why Would You Use Them? (4:17) Start
406. Websocket Solutions - An Overview (1:35) Start
407. Setting Up Socket.io on the Server (3:56) Start
408. Establishing a Connection From the Client (2:27) Start
409. Identifying Realtime Potential (2:42) Start
410. Sharing the IO Instance Across Files (2:46) Start
411. Synchronizing POST Additions (7:14) Start
412. Fixing a Bug - The Missing Username (1:44) Start
413. Updating Posts On All Connected Clients (3:58) Start
414. Sorting Correctly (0:59) Start
415. Deleting Posts Across Clients (2:31) Start
416. Wrap Up (1:48) Start
417. Useful Resources & Links (1:00) Start

Section: Working with GraphQL

418. Module Introduction (0:57) Start
419. What is GraphQL? (9:17) Start
420. Understanding the Setup & Writing our First Query (11:15) Start
421. Defining a Mutation Schema (5:42) Start
422. Adding a Mutation Resolver & GraphiQL (9:42) Start
423. Adding Input Validation (4:19) Start
424. Handling Errors (3:45) Start
425. Connecting the Frontend to the GraphQL API (6:49) Start
426. Adding a Login Query & a Resolver (6:20) Start
427. Adding Login Functionality (4:57) Start
428. Adding a Create Post Mutation (7:23) Start
429. Extracting User Data From the Auth Token (5:48) Start
430. Sending the "Create Post" Query (4:46) Start
431. Fixing a Bug & Adding New Posts Correctly (2:53) Start
432. Adding a "Get Post" Query & Resolver (4:53) Start
433. Sending "Create Post" and "Get Post" Queries (5:13) Start
434. Adding Pagination (4:28) Start
435. Uploading Images (10:26) Start
436. Viewing a Single Post (6:07) Start
437. Updating Posts (9:32) Start
438. Deleting Posts (9:25) Start
439. Managing the User Status (9:17) Start
440. Using Variables (16:06) Start
441. Fixing a Pagination Bug (2:48) Start
442. Wrap Up (3:36) Start
443. Useful Resources & Links (1:00) Start

Section: Deploying our App

444. Module Introduction (1:16) Start
445. Deploying Different Kinds of Apps (1:39) Start
446. Deployment Preparations (4:52) Start
447. Using Environment Variables (11:12) Start
448. Using Production API Keys (1:19) Start
449. Setting Secure Response Headers with Helmet (2:40) Start
450. Compressing Assets (2:33) Start
451. Setting Up Request Logging (3:34) Start
452. Setting Up a SSL Server (9:55) Start
453. Using a Hosting Provider (4:25) Start
454. Understanding the Project & the Git Setup (4:03) Start
455. A Deployment Example with Heroku (10:26) Start
456. Deploying APIs (2:52) Start
457. Useful Resources & Links (1:00) Start

Section: Testing Node.js Applications

458. Module Introduction (0:43) Start
459. What is Testing? (2:42) Start
460. Why & How? (3:25) Start
461. Setup and Writing a First Test (9:40) Start
462. Testing the Auth Middleware (12:33) Start
463. Organizing Multiple Tests (4:12) Start
464. What Not To Test! (8:02) Start
465. Using Stubs (8:38) Start
466. Testing Controllers (8:03) Start
467. Testing Asynchronous Code (5:53) Start
468. Setting up a Testing Database (6:33) Start
469. Testing Code With An Active Database (6:33) Start
470. Cleaning Up (3:29) Start
471. Hooks (4:34) Start
472. Testing Code That Requires Authentication (12:37) Start
473. Wrap Up & Mastering Tests (4:22) Start
474. Useful Resources & Links (1:00) Start
475. New Lecture (1:00) Start

Section: Node.js as a Build Tool & Using npm

476. Module Introduction (1:01) Start
477. npm & Node.js (1:42) Start
478. Using npm (7:52) Start
479. What is a Build Tool? (5:01) Start
480. Using Node.js in Build Processes (5:50) Start
481. Useful Resources & Links (1:00) Start

Section: Modern JavaScript & NodeJS

482. Module Introduction (2:28) Start
483. What is this Module About? (2:19) Start
484. Using ES Modules (9:32) Start
485. More on ES Modules (6:26) Start
486. Node Core Modules & Promises (5:18) Start
487. Module Resources (1:00) Start

Section: Bonus: Node & TypeScript

488. Module Introduction (1:22) Start
489. TypeScript: What & Why (6:02) Start
490. TypeScript Setup (4:09) Start
491. Assigning Types (3:29) Start
492. Type Inference & Type Casting (6:10) Start
493. Configuring TypeScript (5:01) Start
494. Working with Union Types (4:23) Start
495. Using Object and Array Types (6:17) Start
496. Type Aliases & Interfaces (3:22) Start
497. Understanding Generic Types (5:09) Start
498. TypeScript: A Summary (0:34) Start
499. TypeScript & Node: Setup (2:14) Start
500. Getting Started with TypeScript & Node (9:31) Start
501. Writing TypeScript Express.js Code (3:59) Start
502. Adding REST Routes with TS (6:42) Start
503. Finishing the REST Routes (5:53) Start
504. Testing the API (4:52) Start
505. Using Type Casting (4:21) Start
506. Moving to a Better Project Structure (3:44) Start
507. Wrap Up (2:50) Start
508. Module Resources (1:00) Start

Section: DenoJS - An Introduction

509. Module Introduction (1:35) Start
510. What is Deno? (3:09) Start
511. Why Deno? (1:55) Start
512. Deno Setup (5:50) Start
513. Writing First Deno Code (4:18) Start
514. The Deno Runtime (Namespace) API (3:13) Start
515. Using the Runtime API (5:26) Start
516. Working with Deno Permissions (4:31) Start
517. Repeating the Example with Node (4:16) Start
518. How Deno Features Are Organized (4:28) Start
519. Using the Standard Library Modules (8:30) Start
520. Creating a Webserver (2:54) Start
521. Using the Oak Framework with Deno (9:48) Start
522. More on Module URLs (1:00) Start
523. Creating an Example Node REST API (12:15) Start
524. Re-building the REST API with Deno (16:18) Start
525. Should You Switch From Node To Deno? (5:05) Start
526. Module Resources (1:00) Start

Section: Deno & MongoDB

527. Module Introduction (1:00) Start
528. App Setup (4:06) Start
529. Deno & CORS (7:16) Start
530. Establishing a MongoDB Connection (8:05) Start
531. Using the Mongo Module (10:34) Start