Angular and MongoDB: Building a MEAN Stack App

In this tutorial, we will explore how to build a MEAN (MongoDB, Express.js, Angular, and Node.js) stack application. We will start by setting up the development environment, then build the Angular frontend and connect it to MongoDB. Finally, we will deploy the app to a hosting provider. By the end of this tutorial, you will have a fully functional MEAN stack app.

angular mongodb building mean stack app

Introduction

The MEAN stack is a popular web development stack that allows you to build scalable, efficient, and modern web applications. It combines the power of MongoDB, a NoSQL database, with Angular, a JavaScript framework for building single-page applications. This combination provides a robust backend and a dynamic frontend, making it an ideal choice for building complex web applications.

Benefits of using Angular and MongoDB together

By using Angular and MongoDB together, you can take advantage of the strengths of both technologies. Angular provides a powerful frontend framework for building dynamic user interfaces, while MongoDB offers a flexible and scalable database solution. Together, they provide a seamless development experience and allow you to build modern, responsive web applications.

Setting up the Development Environment

Before we can start building our MEAN stack app, we need to set up our development environment. This involves installing Node.js and npm, creating a new Angular project, and installing MongoDB.

Installing Node.js and npm

Node.js and npm are essential tools for building JavaScript applications. Node.js is a runtime environment that allows us to run JavaScript code outside of the browser, while npm is a package manager that simplifies the installation and management of JavaScript libraries and frameworks.

To install Node.js and npm, follow these steps:

  1. Visit the official Node.js website (https://nodejs.org) and download the installer for your operating system.
  2. Run the installer and follow the prompts to install Node.js and npm.
  3. Once the installation is complete, open a terminal or command prompt and run the following command to verify that Node.js and npm are installed correctly:
node -v
npm -v

If you see the version numbers for Node.js and npm, then the installation was successful.

Creating a new Angular project

Now that we have Node.js and npm installed, we can create a new Angular project. The Angular CLI (Command Line Interface) is a powerful tool that simplifies the process of creating and managing Angular projects.

To create a new Angular project, follow these steps:

  1. Open a terminal or command prompt and navigate to the directory where you want to create your project.
  2. Run the following command to install the Angular CLI globally:
npm install -g @angular/cli
  1. Once the installation is complete, run the following command to create a new Angular project:
ng new mean-stack-app
  1. The Angular CLI will prompt you to choose various options for your project. For this tutorial, you can accept the default options by pressing Enter for each prompt.

Installing MongoDB

MongoDB is a NoSQL database that stores data in a flexible, JSON-like format. It is designed to handle large amounts of data and provide high performance and scalability.

To install MongoDB, follow these steps:

  1. Visit the official MongoDB website (https://www.mongodb.com) and download the installer for your operating system.
  2. Run the installer and follow the prompts to install MongoDB.
  3. Once the installation is complete, open a terminal or command prompt and run the following command to start the MongoDB server:
mongod
  1. By default, MongoDB will start running on port 27017. You can verify that the server is running by opening a web browser and navigating to http://localhost:27017. If you see a "It looks like you are trying to access MongoDB over HTTP on the native driver port" message, then MongoDB is running correctly.

Building the Angular Frontend

Now that we have our development environment set up, we can start building the Angular frontend for our MEAN stack app. This involves creating components and services, implementing routing, and handling user authentication.

Creating components and services

Angular uses components to build the user interface of an application. A component is a self-contained unit that represents a part of the user interface and contains its own HTML template, CSS styles, and TypeScript code.

To create a new component in Angular, follow these steps:

  1. Open a terminal or command prompt and navigate to the root directory of your Angular project.
  2. Run the following command to generate a new component:
ng generate component home

This will generate a new component named "home" in the src/app directory. The generated component will have its own HTML, CSS, and TypeScript files.

  1. Repeat this process to create additional components for your application, such as a login component and a dashboard component.

In addition to components, Angular also uses services to encapsulate reusable logic and data. Services can be used to interact with APIs, handle data storage and retrieval, and perform other tasks.

To create a new service in Angular, follow these steps:

  1. Open a terminal or command prompt and navigate to the root directory of your Angular project.
  2. Run the following command to generate a new service:
ng generate service api

This will generate a new service named "api" in the src/app directory. The generated service will have its own TypeScript file.

  1. Repeat this process to create additional services for your application, such as an authentication service and a data service.

Implementing routing

Routing is an essential part of any web application. It allows users to navigate between different pages or views within the application. In Angular, routing is handled by the Angular Router module.

To implement routing in Angular, follow these steps:

  1. Open the src/app/app.module.ts file and import the RouterModule and Routes modules from @angular/router:
import { RouterModule, Routes } from '@angular/router';
  1. Define the routes for your application by creating a constant array of Route objects. Each Route object represents a route in your application and contains a path and a component:
const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'login', component: LoginComponent },
  { path: 'dashboard', component: DashboardComponent }
];
  1. Add the RouterModule.forRoot(routes) method to the imports array in the @NgModule decorator:
@NgModule({
  imports: [
    RouterModule.forRoot(routes)
  ],
  ...
})
export class AppModule { }
  1. In the src/app/app.component.html file, add the <router-outlet></router-outlet> element. This element will be replaced with the component corresponding to the current route:
<router-outlet></router-outlet>
  1. Now you can use the routerLink directive to navigate between routes. For example, to create a link to the login page, add the following code to the src/app/home/home.component.html file:
<a routerLink="/login">Login</a>

Handling user authentication

User authentication is a common requirement for many web applications. In Angular, authentication can be implemented using various techniques, such as JSON Web Tokens (JWT) or session cookies.

To handle user authentication in Angular, follow these steps:

  1. Create an authentication service that provides methods for logging in, logging out, and checking the authentication status. This service can use Angular's HttpClient module to send HTTP requests to an authentication API:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  constructor(private http: HttpClient) {}

  login(username: string, password: string) {
    // Send a POST request to the authentication API with the username and password
    return this.http.post('/api/login', { username, password });
  }

  logout() {
    // Send a GET request to the authentication API to log the user out
    return this.http.get('/api/logout');
  }

  isAuthenticated() {
    // Send a GET request to the authentication API to check if the user is authenticated
    return this.http.get('/api/check-auth');
  }
}
  1. In the login component, import the AuthService and use it to handle the login process:
import { Component } from '@angular/core';
import { AuthService } from '../auth.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent {
  username: string;
  password: string;

  constructor(private authService: AuthService) {}

  login() {
    this.authService.login(this.username, this.password).subscribe(
      () => {
        // Redirect the user to the dashboard page
      },
      (error) => {
        // Display an error message
      }
    );
  }
}
  1. In the dashboard component, import the AuthService and use it to check the authentication status:
import { Component } from '@angular/core';
import { AuthService } from '../auth.service';

@Component({
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent {
  isAuthenticated: boolean;

  constructor(private authService: AuthService) {
    this.authService.isAuthenticated().subscribe(
      (isAuthenticated) => {
        this.isAuthenticated = isAuthenticated;
      }
    );
  }
}
  1. Use Angular's built-in ngIf directive to conditionally display certain parts of the user interface based on the authentication status. For example, you can display a "Logout" button in the dashboard component if the user is authenticated:
<button *ngIf="isAuthenticated" (click)="logout()">Logout</button>

Working with MongoDB

Now that we have built the frontend of our MEAN stack app, we can focus on the backend. In this section, we will explore how to work with MongoDB in our Node.js backend.

Connecting to MongoDB

To connect to MongoDB from our Node.js backend, we can use the official MongoDB Node.js driver or a higher-level library such as Mongoose.

To connect to MongoDB using the official MongoDB Node.js driver, follow these steps:

  1. Install the mongodb package using npm:
npm install mongodb
  1. In your Node.js backend, import the MongoClient class from the mongodb package and use it to connect to the MongoDB server:
const { MongoClient } = require('mongodb');

const url = 'mongodb://localhost:27017';
const dbName = 'mean-stack-app';

MongoClient.connect(url, function(err, client) {
  if (err) {
    console.error('Failed to connect to MongoDB:', err);
    return;
  }

  const db = client.db(dbName);

  // Perform database operations here

  client.close();
});
  1. Replace mean-stack-app with the name of your MongoDB database.

Defining schemas and models

In MongoDB, data is stored in collections, which are similar to tables in a relational database. Each document in a collection represents a record or an object.

To define schemas and models in MongoDB using Mongoose, follow these steps:

  1. Install the mongoose package using npm:
npm install mongoose
  1. In your Node.js backend, import the mongoose package and connect to the MongoDB server:
const mongoose = require('mongoose');

const url = 'mongodb://localhost:27017/mean-stack-app';

mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => {
    console.log('Connected to MongoDB');
  })
  .catch((err) => {
    console.error('Failed to connect to MongoDB:', err);
  });
  1. Define a schema for your MongoDB collection. A schema defines the structure and validation rules for the documents in a collection:
const { Schema } = mongoose;

const userSchema = new Schema({
  username: { type: String, required: true },
  password: { type: String, required: true },
  email: { type: String, required: true },
  createdAt: { type: Date, default: Date.now }
});
  1. Create a model based on the schema. A model represents a collection and provides an interface for interacting with the documents in the collection:
const User = mongoose.model('User', userSchema);

Performing CRUD operations

Once we have defined our schemas and models, we can perform CRUD (Create, Read, Update, Delete) operations on our MongoDB collections.

To perform CRUD operations using Mongoose, follow these steps:

  1. To create a new document in a collection, create a new instance of the model and call the save() method:
const user = new User({
  username: 'john.doe',
  password: 'password123',
  email: '[email protected]'
});

user.save()
  .then(() => {
    console.log('User created successfully');
  })
  .catch((err) => {
    console.error('Failed to create user:', err);
  });
  1. To retrieve documents from a collection, use the find() method:
User.find()
  .then((users) => {
    console.log('Users:', users);
  })
  .catch((err) => {
    console.error('Failed to retrieve users:', err);
  });
  1. To update a document in a collection, use the updateOne() or updateMany() method:
User.updateOne({ username: 'john.doe' }, { password: 'newpassword123' })
  .then(() => {
    console.log('User updated successfully');
  })
  .catch((err) => {
    console.error('Failed to update user:', err);
  });
  1. To delete a document from a collection, use the deleteOne() or deleteMany() method:
User.deleteOne({ username: 'john.doe' })
  .then(() => {
    console.log('User deleted successfully');
  })
  .catch((err) => {
    console.error('Failed to delete user:', err);
  });

Integrating Angular and MongoDB

Now that we have built the frontend and backend of our MEAN stack app, we can integrate Angular and MongoDB to send and retrieve data between the two.

Sending data from Angular to MongoDB

To send data from Angular to MongoDB, we can use Angular's HttpClient module to send HTTP requests to the Node.js backend.

To send data from Angular to MongoDB, follow these steps:

  1. In your Angular component or service, import the HttpClient module from @angular/common/http:
import { HttpClient } from '@angular/common/http';
  1. Inject the HttpClient service into your component or service's constructor:
constructor(private http: HttpClient) {}
  1. Use the post() method of the HttpClient service to send a POST request to the Node.js backend:
this.http.post('/api/users', { username, password, email }).subscribe(
  () => {
    console.log('User created successfully');
  },
  (error) => {
    console.error('Failed to create user:', error);
  }
);
  1. Replace /api/users with the appropriate API endpoint in your Node.js backend.

Retrieving data from MongoDB in Angular

To retrieve data from MongoDB in Angular, we can use Angular's HttpClient module to send HTTP requests to the Node.js backend.

To retrieve data from MongoDB in Angular, follow these steps:

  1. In your Angular component or service, import the HttpClient module from @angular/common/http:
import { HttpClient } from '@angular/common/http';
  1. Inject the HttpClient service into your component or service's constructor:
constructor(private http: HttpClient) {}
  1. Use the get() method of the HttpClient service to send a GET request to the Node.js backend:
this.http.get('/api/users').subscribe(
  (users) => {
    console.log('Users:', users);
  },
  (error) => {
    console.error('Failed to retrieve users:', error);
  }
);
  1. Replace /api/users with the appropriate API endpoint in your Node.js backend.

Deploying the MEAN Stack App

Once we have finished building our MEAN stack app, we can deploy it to a hosting provider to make it accessible to users.

Preparing the app for production

Before deploying the app, it is important to optimize it for production. This involves minimizing the size of the JavaScript and CSS files, enabling caching, and configuring security settings.

To prepare the app for production, follow these steps:

  1. Run the following command in the root directory of your Angular project to build the app for production:
ng build --prod

This will generate a dist directory containing the optimized JavaScript and CSS files.

  1. Configure the server to serve the static files from the dist directory. This can be done using a web server such as Nginx or Apache.

Choosing a hosting provider

There are many hosting providers that support MEAN stack apps. When choosing a hosting provider, consider factors such as pricing, performance, scalability, and ease of deployment.

Some popular hosting providers for MEAN stack apps include:

  • Heroku (https://www.heroku.com)
  • AWS Elastic Beanstalk (https://aws.amazon.com/elasticbeanstalk)
  • Microsoft Azure (https://azure.microsoft.com)
  • Google Cloud Platform (https://cloud.google.com)

Deploying the app

To deploy the app to a hosting provider, follow the instructions provided by the hosting provider. These instructions may vary depending on the provider and the deployment method you choose.

In general, the deployment process involves creating an account, setting up a new app or environment, configuring the server settings, and uploading the app files.

Conclusion

In this tutorial, we have learned how to build a MEAN stack app using Angular and MongoDB. We started by setting up the development environment and building the Angular frontend. Then, we connected to MongoDB, defined schemas and models, and performed CRUD operations. Finally, we integrated Angular and MongoDB to send and retrieve data between the two, and deployed the app to a hosting provider.

By following this tutorial, you should now have a solid understanding of how to build and deploy MEAN stack apps using Angular and MongoDB. You can use this knowledge to build your own web applications and take advantage of the benefits of the MEAN stack. Happy coding!