Overview
En esta guía, se aprenderá a crear una aplicación web Angular que utiliza la pila MEAN. El pila MEAN es un marco para el desarrollo web que utiliza MongoDB, Express, Angular y Node.js y consta de las siguientes capas:
Capa de base de datos: MongoDB proporciona almacenamiento y recuperación de datos.
Capa de aplicación: Express y Node.js constituyen el nivel intermedio para la lógica del lado del servidor.
Capa de presentación: Angular implementa la interfaz de usuario y las interacciones del front-end.
¿Por qué utilizar MongoDB en una aplicación Angular?
Angular es un framework de TypeScript utilizado para crear aplicaciones web dinámicas. Proporciona paquetes incorporados para un rango de funcionalidades de aplicaciones, y su arquitectura basada en componentes hace que las aplicaciones sean altamente reutilizables.
Dado que TypeScript está basado en JavaScript, cada elemento de la pila MEAN se basa en JavaScript y JSON. Como resultado, la integración entre estos elementos es sencilla. El front end de Angular crea documentos JSON que MongoDB puede almacenar directamente en formato BSON, una extensión binaria de JSON, y Express proporciona un framework minimalista que usa JavaScript. MongoDB proporciona funcionalidades avanzadas de indexación y consulta para documentos BSON e incluye un driver nativo para Node.js, lo que lo convierte en un almacén de datos ideal para aplicaciones JavaScript.
Tutorial de inicio rápido
Este tutorial muestra cómo crear una aplicación web con la pila MEAN. La aplicación accede a datos de muestra de restaurantes, los consulta y muestra los resultados en un sitio web alojado localmente. El tutorial también incluye instrucciones para conectarse a un clúster de MongoDB alojado en MongoDB Atlas y acceder y mostrar datos de su base de datos.
Tip
Si prefieres conectarte a MongoDB usando el driver de Node.js sin Angular, consulta el Comiencea utilizar la guía del controlador Node.js.
Configurar el proyecto
Siga los pasos de esta sección para instalar las dependencias del proyecto, crear un clúster de Atlas y configurar los directorios de la aplicación.
Verificar los prerrequisitos.
Para crear la aplicación Quick Start, instala el siguiente software en tu entorno de desarrollo:
Requisito previo | notas |
|---|---|
Descarga la versión LTS más reciente o versión más reciente. | |
Instale globalmente ejecutando | |
Editor de código | Utilice el editor de su elección. |
Aplicación de terminal y shell | Para usuarios de macOS, usen Terminal o una aplicación similar. Para usuarios de Windows, usen PowerShell. |
Crea un clúster de MongoDB Atlas.
MongoDB Atlas es un servicio de base de datos en la nube completamente gestionado que aloja tus implementaciones de MongoDB. Si no tienes una implementación de MongoDB, puedes crear un clúster de MongoDB de forma gratuita al completar el Tutorial de Introducción a MongoDB. El tutorial para comenzar con MongoDB también muestra cómo cargar conjuntos de datos de muestra en tu clúster, incluyendo la base de datos sample_restaurants que se usa en este tutorial.
Para conectarte a tu clúster de MongoDB, debes usar un URI de conexión. Para saber cómo recuperar tu URI de conexión, consulta la sección Agrega tu cadena de conexión del tutorial Primeros pasos de MongoDB.
Importante
Guarda tu cadena de conexión en una ubicación segura.
Crea tus directorios de proyecto.
Ejecuta los siguientes comandos en tu terminal para crear un directorio para tu proyecto llamado angular-quickstart:
mkdir angular-quickstart cd angular-quickstart
A continuación, ejecuta los siguientes comandos desde el directorio angular-quickstart para crear una carpeta para el back end llamada server e inicializar el archivo package.json:
mkdir server cd server npm init -y
Modifica tu package.json archivo.
Navega al archivo package.json en el directorio angular-quickstart/server. Para utilizar módulos ECMAScript, el formato estándar para empaquetar código JavaScript reutilizable, sustituya la línea existente que especifica el campo "type" por la siguiente línea:
"type": "module",
Instala las dependencias.
Ejecuta el siguiente comando para instalar las dependencias mongodb, express, cors y dotenv:
npm install mongodb express cors dotenv
Este comando instala MongoDB, el framework web Express, el paquete cors Node.js para el uso compartido de recursos entre orígenes y Dotenv para cargar variables de entorno.
A continuación, ejecute el siguiente comando para instalar TypeScript y las definiciones de tipos requeridas:
npm install -D typescript @types/node @types/cors @types/express tsx
Este comando instala TypeScript, definiciones de tipos para Node.js y Express, y tsx, una herramienta para ejecutar archivos TypeScript directamente.
Configurar el Back-End
Después de configurar la estructura del proyecto y las dependencias, sigue los pasos en esta sección para configurar tu servidor web y conectarte a MongoDB.
Configura tu servidor web Express.
Crea un archivo llamado server.ts en tu directorio angular-quickstart/server y pega el siguiente código:
import express from "express"; import cors from "cors"; import restaurants from "./routes/restaurant.js"; const PORT = process.env.PORT || 5050; const app = express(); app.use(cors()); app.use(express.json()); app.use("/restaurant", restaurants); // start the Express server app.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); });
Establecer variables de entorno.
En el directorio server, cree un archivo .env y pegue el siguiente código:
MONGODB_URI=<connection string> PORT=5050
Reemplace el <connection string> marcador de posición con la cadena de conexión que guardó en un paso anterior.
Conecta tu servidor a la base de datos.
En el directorio server, crea un subdirectorio llamado db. Agregue un nuevo archivo llamado connection.ts a este subdirectorio y pegue el siguiente código:
import "dotenv/config"; import { MongoClient, Db } from "mongodb"; const uri = process.env.MONGODB_URI || ""; const client = new MongoClient(uri); try { // Connects the client to the server await client.connect(); // Sends a ping to confirm a successful connection await client.db("admin").command({ ping: 1 }); console.log( "Pinged your deployment. You successfully connected to MongoDB!" ); } catch(err) { console.error(err); } const db: Db = client.db("sample_restaurants"); export default db;
Este archivo se conecta a tu implementación de MongoDB, accede a la base de datos sample_restaurants y pone a prueba la conexión a la base de datos.
Crear puntos finales de API de servidor.
En el directorio server, crea un subdirectorio llamado routes. Cree un archivo llamado restaurant.ts en este subdirectorio y pegue el siguiente código:
import express, { Request, Response } from "express"; import db from "../db/connection.js"; // Creates an instance of the Express router, used to define our routes const router = express.Router(); // Gets a list of all the restaurants router.get("/", async (req: Request, res: Response) => { let collection = db.collection("restaurants"); let results = await collection.find({}).toArray(); res.send(results).status(200); }); // Lists restaurants that match the query filter router.get("/browse", async (req: Request, res: Response) => { try { let collection = db.collection("restaurants"); let query = { borough: "Queens", name: { $regex: "Moon", $options: "i" }, }; let results = await collection.find(query).toArray(); res.send(results).status(200); } catch (err) { console.error(err); res.status(500).send("Error browsing restaurants"); } }); export default router;
Este archivo accede a la colección restaurants en la base de datos sample_restaurants y define los siguientes endpoints GET:
/: Recupera todos los restaurantes de la colección de muestras/browse: Recupera restaurantes que cumplen los criterios de la query, la cual filtra los restaurantes de Queens que contienen la palabra"Moon"en el nombre
Configurar el front-end
Después de configurar el backend de la aplicación, sigue los pasos de esta sección para configurar Angular y agregar los componentes del frontend.
Crear la aplicación Angular.
Navega al directorio angular-quickstart y ejecuta el siguiente comando para crear una nueva aplicación Angular:
ng new client
Este comando le solicita que responda a una serie de preguntas de configuración. Para cada pregunta, elija las siguientes respuestas:
¿Qué sistema de hoja de estilos te gustaría usar? Selecciona Tailwind CSS
¿Deseas habilitar la Renderización del lado del servidor (SSR) y la Generación de sitios estáticos (SSG/Prerendering)? Introduzca N
¿Qué herramientas de IA quieres configurar con las mejores prácticas Angular? Selecciona las herramientas de tu elección
Tras ejecutar el comando, su proyecto tendrá un directorio client que contiene el andamiaje frontend. El comando también configura su proyecto para usar TailwindCSS, un framework para el formato de interfaz de usuario.
Crear el servicio de restaurante.
Desde el directorio client, ejecute el siguiente comando para generar un servicio que maneje las llamadas API a su back end:
ng generate service restaurant
Navega al archivo client/src/app/restaurant.ts y reemplaza el contenido con el siguiente código:
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; export interface Restaurant { _id: string; name: string; borough: string; cuisine: string; } ({ providedIn: 'root' }) export class RestaurantService { private apiUrl = 'http://localhost:5050/restaurant'; constructor(private http: HttpClient) {} getAllRestaurants(): Observable<Restaurant[]> { return this.http.get<Restaurant[]>(this.apiUrl); } getFilteredRestaurants(): Observable<Restaurant[]> { return this.http.get<Restaurant[]>(`${this.apiUrl}/browse`); } }
Este servicio define métodos para obtener datos del restaurante desde tu API Express.
Configura el enrutamiento.
Navega al archivo client/src/app/app.routes.ts y reemplaza el contenido con el siguiente código:
import { Routes } from '@angular/router'; import { RestaurantListComponent } from './restaurant-list/restaurant-list'; export const routes: Routes = [ { path: '', component: RestaurantListComponent }, { path: 'browse', component: RestaurantListComponent } ];
Este archivo configura el enrutamiento del lado del cliente y define las siguientes rutas:
/: Muestra todos los restaurantes desde el punto final de la API/restaurant//browseMuestra restaurantes filtrados del punto final de API/restaurant/browse
Actualiza la configuración de la aplicación.
Navega al archivo client/src/app/app.config.ts y reemplaza el contenido con el siguiente código:
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { provideHttpClient } from '@angular/common/http'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideHttpClient() ] };
Esta configuración habilita la funcionalidad del cliente HTTP para realizar solicitudes API.
Crea el componente de lista de restaurantes.
Ejecute el siguiente comando desde el directorio client para generar un componente para mostrar restaurantes:
ng generate component restaurant-list
Navega al archivo client/src/app/restaurant-list/restaurant-list.ts y reemplaza el contenido con el siguiente código:
import { Component, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { Router } from '@angular/router'; import { RestaurantService, Restaurant } from '../restaurant'; ({ selector: 'app-restaurant-list', standalone: true, imports: [CommonModule], templateUrl: './restaurant-list.html', styleUrl: './restaurant-list.css' }) export class RestaurantListComponent implements OnInit { restaurants: Restaurant[] = []; loading = true; error = ''; constructor( private restaurantService: RestaurantService, public router: Router ) {} ngOnInit(): void { this.loadRestaurants(); } loadRestaurants(): void { const isFiltered = this.router.url === '/browse'; const observable = isFiltered ? this.restaurantService.getFilteredRestaurants() : this.restaurantService.getAllRestaurants(); observable.subscribe({ next: (data) => { this.restaurants = data; this.loading = false; }, error: (err) => { this.error = 'Failed to load restaurants'; this.loading = false; console.error('Error loading restaurants:', err); } }); } }
A continuación, ve al archivo client/src/app/restaurant-list/restaurant-list.html y reemplaza el contenido con el siguiente código:
<div *ngIf="loading" class="text-center py-8"> <p class="text-gray-600">Loading restaurants...</p> </div> <div *ngIf="error" class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded"> {{ error }} </div> <div *ngIf="!loading && !error"> <h3 class="text-lg font-semibold p-4"> {{ router.url === '/browse' ? 'Filtered Restaurants (Queens, containing "Moon")' : 'All Restaurants' }} </h3> <div class="border rounded-lg overflow-hidden"> <div class="relative w-full overflow-auto"> <table class="w-full caption-bottom text-sm"> <thead class="[&_tr]:border-b"> <tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"> <th class="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0"> Name </th> <th class="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0"> Borough </th> <th class="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0"> Cuisine </th> </tr> </thead> <tbody class="[&_tr:last-child]:border-0"> @for (restaurant of restaurants; track restaurant._id) { <tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"> <td class="p-4 align-middle [&:has([role=checkbox])]:pr-0"> {{ restaurant.name }} </td> <td class="p-4 align-middle [&:has([role=checkbox])]:pr-0"> {{ restaurant.borough }} </td> <td class="p-4 align-middle [&:has([role=checkbox])]:pr-0"> {{ restaurant.cuisine }} </td> </tr> } </tbody> </table> </div> </div> </div>
Este componente recupera y muestra la información del restaurante según la ruta actual.
Actualiza el componente principal de la aplicación.
Navega al archivo client/src/app/app.ts y reemplaza el contenido con el siguiente código:
import { Component } from '@angular/core'; import { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router'; ({ selector: 'app-root', standalone: true, imports: [RouterOutlet, RouterLink, RouterLinkActive], templateUrl: './app.html', styleUrl: './app.css' }) export class AppComponent { title = 'Restaurant Browser'; }
A continuación, ve al archivo client/src/app/app.html y reemplaza el contenido con el siguiente código:
<div class="w-full p-6"> <nav class="flex justify-between items-center mb-6"> <a routerLink="/"> <img alt="MongoDB logo" class="h-10 inline" src="https://d3cy9zhslanhfa.cloudfront.net/media/3800C044-6298-4575-A05D5C6B7623EE37/4B45D0EC-3482-4759-82DA37D8EA07D229/webimage-8A27671A-8A53-45DC-89D7BF8537F15A0D.png" /> </a> <div class="flex gap-4"> <a routerLink="/" routerLinkActive="font-bold" [routerLinkActiveOptions]="{exact: true}" class="text-blue-600 hover:underline"> All Restaurants </a> <a routerLink="/browse" routerLinkActive="font-bold" class="text-blue-600 hover:underline"> Filtered Restaurants </a> </div> </nav> <router-outlet></router-outlet> </div>
Este es el componente principal de la aplicación que incluye la navegación y representa los componentes secundarios apropiados en función de la ruta actual.
Actualizar tu archivo principal.
Navega al archivo client/src/main.ts y reemplaza el contenido con el siguiente código:
import 'zone.js'; import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app'; bootstrapApplication(AppComponent, appConfig) .catch((err) => console.error(err));
Este archivo actúa como el punto de entrada de tu aplicación, y aplica y renderiza tu configuración.
Ejecutar la aplicación
Por último, sigue los pasos de esta sección para ejecutar la aplicación y ver los datos del restaurante renderizados.
Ejecuta la aplicación de cliente.
En una ventana de terminal aparte, dirígete al directorio client. Ejecuta el siguiente comando para iniciar el frontend de Angular:
ng serve
Si es exitoso, este comando muestra la siguiente información:
Application bundle generation complete. Watch mode enabled. Watching for file changes... NOTE: Raw file sizes do not reflect development server per-request transformations. ➜ Local: http://localhost:4200/ ➜ press h + enter to show help
Su aplicación Angular realiza solicitudes HTTP desde el puerto 4200 al puerto 5050 para recuperar datos.
Abra el sitio de la aplicación.
Abra la URL http://localhost:4200 /. La página de destino inicial muestra una lista de todos los restaurantes de la sample_restaurants.restaurants colección:

Luego, haga clic en el Filtered Restaurants Enlace en la barra de navegación para ver los restaurantes que coinciden con la consulta de los campos name y borough:

¡Felicidades por completar el tutorial de inicio rápido!
Después de completar estos pasos, tendrá una aplicación web Angular que se conecta a su implementación de MongoDB, ejecuta una consulta en datos de muestra del restaurante y presenta los resultados en un sitio web alojado localmente.
Recursos adicionales
Para obtener más información sobre Angular, MongoDB y la pila MEAN, consulte los siguientes recursos:
Angular documentation
Express documentation
Documentación delcontrolador Node.js
¿Qué es la pila MEAN? artículo