- JS - prototype based, dynamic, object oriented language
- JS Engine - V8, Chakra, SpiderMonkey
- NodeJS is not a language or framework, its runtime for JS
- NodeJS is non-blocking event-driven asynchronous runtime
- NodeJS - V8 + libuv
- Eventloop - hotel waiter kitchen example with eventqueue/callbackqueue
- NodeJS is for I/O or Network intensive applications and not for CPU intensive applications
- Global Object
- Module per file abstraction
- Module Creation
- require vs import -> ES Modules and CommonJS modules
- Module Wrapper Function
- Path Module
- OS Module
- File System Module
- Events Module
- Event Arguments
- Extending Event Emitter
- HTTP Module
- Introduction
- Package.json
- Node Package Installation
- Using a Package
- Package Dependencies
- NPM Packages and Source Control
- Semantic Versioning
- Listing the Installed Packages
- Registry Info Viewing for A Package
- Specific Version of a Package Installing
- Local Packages Updating
- DevDependencies
- A Package Uninstalling
- Working with Global Packages
- Updating a Published Package
- Building RESTful API's Using Express
- Introduction
- RESTful Services
- Introducing Express
- First Web Server Building
- Nodemon
- Environment Variables
- Route Parameters
- Handling HTTP GET Requests
- Handling HTTP POST Requests
- Calling Endpoints Using Postman
- Input Validation
- Handling HTTP PUT Requests
- Handling HTTP Delete Requests
- Introduction
- Creating Custom Middleware
- Built-in Middleware
- Third-party Middleware
- Environments
- Configuration
- Debugging
- Templating Engines
- Database Integration
- Authentication
- Structuring Express Applications
- Synchronous vs Asynchronous Code
- Patterns for Dealing with Asynchronous Code
- Callbacks
- Callback Hell
- Named Functions to Rescue
- Promises
- Replacing Callbacks with Promises
- Consuming Promises
- Creating Settled Promises
- Running Promises in Parallel
- Async and Await
- Introducing MongoDB
- Installing MongoDB on Mac
- Installing MongoDB on Windows
- Connecting to MongoDB
- Schemas
- Models
- Saving a Document
- Querying Documents
- Comparison Query Operators
- Logical Query Operators
- Regular Expressions
- Counting
- Pagination
- Validation
- Built-in Validators
- Custom Validators
- Async Validators
- Validation Errors
- SchemaType Options
- Project- Add Persistence to Genres API
- Project- Build the Customers API
- Modelling Relationships
- Referencing Documents
- Population
- Embedding Documents
- Using an Array of Sub-documents
- Introduction
- Creating the User Model
- Registering Users
- Using Lodash
- Hashing Passwords
- Authenticating Users
- Testing the Authentication
- JSON Web Tokens
- Generating Authentication Tokens
- Storing Secrets in Environment Variables
- Setting Response Headers
- Encapsulating Logic in Mongoose Models
- Authorization Middleware
- Protecting Routes
- Getting the Current User
- Logging Out Users
- Role-based Authorization
- Introduction
- Handling Rejected Promises
- Express Error Middleware
- Removing Try Catch Blocks
- Express Async Errors
- Logging Errors
- Logging to MongoDB
- Uncaught Exceptions
- Unhandled Promise Rejections
- Error Handling Recap
- Extracting Routes
- Extracting the Db Logic
- Extracting the Logging Logic
- Extracting the Config Logic
- Extracting the Validation Logic
- What is Automated Testing
- Benefits of Automated Testing
- Types of Tests
- Test Pyramid
- Tooling
- Writing Your First Unit Test
- Testing Numbers
- Grouping Tests
- Refactoring with Confidence
- Testing Strings
- Testing Arrays
- Testing Objects
- Testing Exceptions
- Continuously Running Tests
- Exercise- Testing the FizzBuz
- Interaction Testing
- Jest Mock Functions