- MongoDB — the database
- Express — the web framework
- Angular — the front-end framework
- Node.js — the web server
Why the MEAN stack specifically?
Introducing Node.js The web server/platform
Fast, efficient, and scalable
Another reason for the popularity of Node.js is ,when coded correctly, it's extremely fast and makes very efficient use of system resources. This enables a Node.js application to serve more users on fewer server resources then most of the other mainstream server technologies. Business owners also like the idea of Node.js because it can reduce their running costs, even at a large scale.
Node.js is light on system resources because it's single-threaded, whereas traditional web server are multithreaded.
Traditional multithreaded web server
This approach works perfectly well as long as you have enough tellers to service the customers.
This is one of the reasons why web servers are often overpowered and have so much RAM, even though they don't need it 90% of the time.
A single-threaded web server
A Node.js server is single-threaded and works differently than the multithreaded server. Rather than giving each visitor a unique thread and a separate silo of resources, every visitor joins the same thread. A visitor and thread interact only when needed, when the visitor is requesting something or thread is responding to a request.
Blocking versus nonblocking code
With the single-threaded model, it's important to remember that all of your users use the same central process. To keep the flow smooth, you need to make sure that nothing in your code causes a delay, blocking another operation.
So for the single-threaded approach to work, you must make sure your code is nonblocking. The way to achieve this is to make any blocking operations run asynchronously, preventing them from blocking the flow of your main process.
Introducing Express: The framework
Express is the E in MEAN. Because Node.js is a platform, it doesn't prescribe how it should be set up or used. This is one of its great strengths. But when creating websites and web applications, there are quite a few common tasks that need doing every time. Express is a web application framework for Node.js that has been designed to do this in a well-tested and repeatable way.
Easing your server setup
As already noted, Node.js is a platform, not a server. This allows you to get creative with your server setup and do things that other web servers can't do. It also makes it harder to get a basic website up and running.
Express abstracts away this difficult by setting up a web server to listen to incoming requests and return relevant responses. In addition, it also defines a directory structure. One of these folders is set up to serve static files in a nonblocking way; the last thing you want is for your application to have to wait when somebody else requests a CSS file! You could configure
Routing URLs to responses
One of the great features of Express is that it provides a really simple interface for directing an incoming URL to a certain piece of code. Whether this is going to serve a static HTML page, read from a database, or write to a database doesn't really matter. The interface is simple and consistent.
What Express has done is abstract away some of the complexity of doing this in native Node.js, to make code quicker to write and easier to maintain.
Views: HTML responses
It's likely that you'll want to respond to many of the requests to your application by sending some HTML to the browser. By now it will come as no surprise to you that Express makes this easier than it is in native Node.js.
Express provides support for many different templating engines that make it easier to build HTML pages in an intelligent way, using reusable components as well as data from your application. Express compiles these together and serves them to the browser as HTML.
Remembering visitors with session support
Being single-threaded, Node.js doesn't remember a visitor from one request to the next. It doesn't have a silo of RAM set aside just for you; it sees only a series of HTTP requests. HTTP is a stateless protocol, so there's no concept of storing a session state. As it stands, this makes it difficult to create a personalized experience in Node.js or have a secure area where a user has to log in: it's not much use if the site forgets who you are on every page. You can do it, of course, but you have to code it yourself.
Express comes with the ability to use
sessions so that you can identify individual visitors through multiple requests and pages.
Sitting on top of Node.js, Express gives you a great helping and a sound starting point for building web applications. It abstracts away many complexities and repeatable tasks that most o us don't need — or want — to worry about. We just want to build web applications.
Introducing MongoDB: The database
The ability to store and use data is vital for most applications. In the MEAN stack, the database of choice is MongoDB, the M in MEAN. MongoDB fits into the stack incredibly well. Like Node.js, it's renowned for being fast and scalable.
Relational versus document databases
Mongo DB is a document database. The concept of rows still exists but columns are removed from the picture. Rather than a column defining what should be in the row, each row is a document, and this document both defines and holds the data itself.
This less-structured approach means that a collection of documents could have a wide variety of data inside.
More than just a document database
MongoDB sets itself apart from many other document databases with its support for secondary indexing and rich queries. This means that you can create indexes on more than just the unique identifier field, and querying indexed fields is much faster. You can also create some fairly complex queries against a MongoDB database — not to the level of huge SQL commands with coins all over the place, but powerful enough for most use cases.
What is MongoDB not good for?
Mongo DB isn't a transactional database and shouldn't be used as such. A transactional database can take several separate operations as one transaction. If any one of the operations in a transaction should fail, the entire transaction fails and none of the operations complete.
Mongoose for data modeling and more
MongoDB's flexibility about what it stores in documents is a great thing for the database. But most applications need some structure to their data. Note that it's the application that needs the structure, not the database. So where does it make most sense to define the structure of your application data? In the application itself!
To this end, the company behind MongoDB created Mongoose. In their own words, Mongoose provides "elegant MongoDB object modeling for Node.js".
What is data modeling?
Data modeling, in the context of Mongoose and MongoDB, is defining what data can be in a document, and what data must be in a document. This information is defined in a schema, which is used as the basis for the data model.
What else does mongoose offer?
As well as modeling data, Mongoose adds an entire layer of features on top of MongoDB that are useful when building web applications. Mongoose makes it easier to manage the connections your MongoDB database, and to save and read data. We'll use all of this later. We'll also discuss how Mongoose enables you to add data validation at the scheme level, making sure that you allow only valid data to be saved in the database.
MongoDB is great choice of database for most web applications because it provides a balance between the speed of pure. Document databases and the power of relational databases. That the data is effectively stored in JSON makes it the perfect data store for the MEAN stack.
Introducing Angular: The front-end framework
You could use Node.js, Express, and MongoDB to build a fully functioning data-driven web application. But you can put some icing on the cake by adding Angular to the stack.
The traditional way of doing things is to have all data processing and application logic on the server, which then passes HTML to the browser. Angular enables yo auto move some or all of this processing and logic to the browser, often leaving the server just passing data from the database.
jQuery versus Angular
If you're familiar with jQuery, you might be wondering if Angular works the same way. The short answer is no, not really. Jquery is generally added to a page to provide interactivity, after the HMTL has been sent to the browser and the Document Object Model (DOM) has completely loaded. Angular comes in a step earlier puts the HTML together based on the data provided.
Aslo jQuery is a library, and as such has a collection of features that you can use as you wish. Angular is what is known as an opinionated framework. This means the it forces its opinion on you as to how it needs to be used.
As mentioned, Angular haps put the HTML together based on the data provided ,but it does more than this. It also immediately updates the HTML if the data changes, and can also update the data if the HMTL changes. This is known as two-way data binding.
Two-way data binding: Working with data in a page
To understand two-way data binding let's start with a look at the traditional approach of one-way data binding. One-way data binding is what you're aiming for when looking at using Node.js, Express, and MongoDB. Node.js gets the data from MongoDB, and Express then uses a template to compile this data into HTML that's then delivered to the server. This process is illustrated in figure 1.5.
Two-way data binding is different.
- First, the template and data are sent independently to the browser. The browser itself compiles the template into the view and the data into a model.
- The real difference is that the view is "live." The view is bound to the model, so if the model changes the view changes instantly. On top of this, if the view changes the model also changes. Two-way binding is illustrated in figure 1.6.
Because your data store is likely to be exposed via an API and not tightly coupled to the application, there's typically some processing involved before adding it to the model. You want to make sure that you're binding the correct, relevant data to the view.
Using Angular to load new pages
Something that Angular has been specifically designed for is single-page application (SPA) functionality. In real terms, an SPA runs everything inside the browser and never does a full page reload. What this means is that all applications logic, data processing, user flow, and template delivery can be managed in the browser.
Are there any downsides?
One thing you can do is use Angular for some things and not others. There's nothing wrong with using Angular selectively in your project. For example, you might have a data-rich interactive application or section of your site that's ideal for building in Angular. You might also have a blog or some marketing pages around you application. These don't need to be built in Angular, and arguably would be better served from the server in the traditional way. So part of your site is served by Node.js, Express, and MongoDB, and another part also has Angular doing its thing.
The MEAN stack gives you everything you need for creating data-rich interactive web applications, but you may wheat to use a few extra technologies to help you on the way. You an use Twitter Bootstrap to help create a good user interface, Git to help manage your code, and Heroku to help hosting the application on a live URL.
Twitter Bootstrap for user interface
Bootstrap is a front-end framework that provides a wealth of help for creating a great user interface. Among its features, Bootstrap provides a responsive grid system, default styles for many interface components, and the ability to change the visual appearance with themes.
Responsive grid layout
In a responsive layout, your serve up a single HTML page that arranges itself differently on different devices. This is done through detecting the screen resolution rather than trying to sniff out the actual device.
CSS classes and HTML components
Bootstrap comes with a set of predefined CSS classes that can create useful visual components. These include things like page headers, flash-message containers, labels and badges, stylized lists … the list goes on! They've thought of a lot, and it really helps you quickly build an application without having to spend too much time on the HTML layout and CSS styling.
Adding themes for a different feel
Bootstrap has a default look and feel that provides a really neat baseline. This is so commonly used your site could end up looking like anybody else's. Fortunately, it's possible to download themes for Bootstrap to give your application a different twist. Downloading a theme is often as a simple as replacing the Bootstrap CSS file with a new one.
Hosting with Heroku
Hosting Node.js applications can be complicated, but it doesn't have to be. Many traditional shared hosting providers haven't kept up with the interest in Node.js. Some will install it for you so that you can run applications, but the servers are generally not set up to meet the unique needs of Node.js. To run a Node.js application successfully you need. Either a server that has been configured with that in mind, or you can use a Pass provider that's aimed specifically at hosting Node.js.
Heroku is one of the leading hosts for node.js applications, and it has an excellent free tier that we'll be making use of.
Applications on Heroku are essentially Git repositories, making the publishing process incredibly simple. After everything is set up you can publish your application to a live environment using a single command:
$ git push heroku master
Putting it together with a practical example
As already mentioned a few times, throughout the course of this book we'll build a toking application on the MEAN stack. This will give you a good grounding in each of the technologies, as well as showing how they all fit together.
How the MEAN stack components work together