Preface What this book covers What you need for this book Who this book is for Conventions Reader feedback Customer support Downloading the example code Errata Piracy Questions Welcome to JavaScript in the Full Stack A short introduction to Node.js The advantage that the V8 engine brings in Node.js is single-threaded! Non-blocking asynchronous execution npm - the Node Package Manager Sharing and reusing JavaScript Not just for building web servers! Real-time web application with Socket.io Networking and file IO Microservices Internet of things (IoT) A simple server with Node.js When to use Node.js The NoSQL movement A short introduction to MongoDB JSON-friendly database Schema-less design Various performance facets Node.js and MongoDB in the wild What to expect from this book Summary Getting Up and Running Installing Node.js Mac OS X Windows Linux Testing that Node.js is installed properly Online documentation Installing MongoDB Mac OS X installation instructions Windows 7/Windows 8 installation instructions Linux installation instructions Confirming successful MongoDB installation Bookmarking the online documentation Writing your first app Creating the sample application Getting the dependent modules in place Adding the application code Understanding the code Launching the sample app Checking the actual database Summary Node and MongoDB Basics A JavaScript primer Introducing es6 Syntax basics Understanding the scope of variables Data types Operators and flows Understanding objects Understanding arrays Understanding functions Anonymous functions and callbacks JSON The basics of Node.js Node.js architecture Event-driven Asynchronous execution The module system The Node.js core HTTP Net Streams Installing modules using npm The basics of MongoDB The Mongo shell Inserting data Querying Updating data Deleting data Additional resources Summary Introducing Express Web application frameworks What is Express.js? Building a complete web application Designing the web application Organizing the files Creating the application's entry point Booting up the application Middlewares Creating custom middleware Order of middlewares The configure module Activating the configure module Routers and controllers Handlebars as View engines Summary Templating with Handlebars Templating engines Server-side and client-side templating Client-side templating Server-side templating The basics of Handlebars Binding an object to the template Embedding presentation logic Views Layouts Partial views Handlebars helpers Global helpers View-specific helpers Rendering the views Summary Controllers and View Models Controllers View models Updating the home controller Updating the image controller Displaying an image Uploading an image Helpers for reusable code The sidebar module The stats module The images module The comments module Testing the sidebar implementation Iterating on the UI Summary Persisting Data with MongoDB Using MongoDB with Node.js Connecting to MongoDB Inserting a document Retrieving a document Introducing Mongoose Schemas Models Built-in validation Static methods Virtual properties Context of method (this) Connecting with Mongoose Defining the schemas and models The models index file Adding CRUD to the controllers The home controller The image controller Index - retrieving an image model Create - inserting an image model Testing everything out so far The like button and updating an image model Comment - inserting a comment model Wrapping it up Helpers Introducing the async module The comments helper The sidebar helper Troubleshooting The stats helper The popular images helper Iterating by adding an image removal capability Adding a route Adding a controller handler Updating the Handlebars image page template Updating jQuery Refactoring and improvements Summary Creating a RESTful API What is an API? What is a RESTful API? Introducing Postman REST Client Installation instructions A quick tour of Postman REST Client Using the JSONView Chrome extension Creating a basic API server Creating sample JSON data Responding to GET requests Receiving data - POST and PUT requests Removing data - DELETE Consuming external APIs from Node.js Consuming an API endpoint using request Summary Testing Your Code The tools of the trade Running tests with the Mocha framework Asserting tests with Chai.js Getting started with Chai Spies and stubs with Sinon.js Stubbing node modules with Proxyquire Writing and running your first test Writing a test helper Testing the application Testing the routes Testing the server Testing a model Testing a controller Spy and stub everything! Automating everything Summary Deploying with Cloud-Based Services Cloud versus traditional hosting Infrastructure as a Service versus Platform as a Service An introduction to Git Deploying your application Nodejitsu Heroku Amazon Web Services Creating a MongoLab account and database Create and configure the AWS environment Microsoft Azure Digital Ocean Summary Popular Node.js Web Frameworks Koa Meteor Sails Flatiron total.js LoopBack Hapi Kick starting Hapi.js Scaffolding the Hapi app Setting up a server Creating APIs Creating a configuration-based architecture Summary Single Page Applications with Popular Frontend Frameworks Why use a frontend framework? What is a single page application? The TodoMVC project Backbone.js Ember.js React.js Angular Scaffolding the Angular app Understanding TypeScript and es6 Modules and components Angular data flow architecture Services Forms Component communication Frontend development tools Automated build task managers Dependency management Modularity HTML template-rendering engines CSS transpiling Testing and test-driven development PhantomJS headless browser Summary