Docs Menu
Docs Home
/ /

Integrar Next.js con MongoDB

En esta guía, aprenderá a crear una aplicación web Next.js que se integre con MongoDB. Next.js es un framework de React que ofrece renderizado del lado del servidor, generación de sitios estáticos y rutas API en una sola aplicación. La aplicación de este tutorial consta de las siguientes capas:

  • Capa de base de datos: MongoDB proporciona almacenamiento y recuperación de datos.

  • Capa de API: las rutas de API de Next.js manejan la lógica del lado del servidor y las operaciones de la base de datos.

  • Capa de presentación: los componentes de React implementan la interfaz de usuario y las interacciones del frontend.

Next.js es un framework React integral que te permite crear tanto el front-end como el back-end de tu aplicación en una única base de código. Al integrar MongoDB con Next.js, puedes aprovechar las siguientes ventajas:

  • Desarrollo unificado: escriba el código del cliente y del servidor en JavaScript/TypeScript

  • Representación del lado del servidor: obtenga datos de MongoDB durante la representación del lado del servidor para mejorar el SEO y el rendimiento

  • Rutas API: cree puntos finales de API sin servidor que se conecten directamente a MongoDB

  • Modelo de datos flexible: el modelo de documento de MongoDB se alinea naturalmente con los objetos de JavaScript y el estado de los componentes de React

Next.js con MongoDB es ideal para aplicaciones que requieren contenido dinámico, autenticación de usuarios, actualizaciones en tiempo real y relaciones de datos complejas.

Este tutorial muestra cómo crear una aplicación web con Next.js y MongoDB. 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 prefiere conectarse a MongoDB utilizando el controlador Node.js sin Next.js, consulte la Comiencea utilizar la guía del controlador Node.js.

Siga los pasos de esta sección para instalar las dependencias del proyecto, crear un clúster Atlas y configurar los directorios de la aplicación.

1

Para crear la aplicación, necesita tener instalado en su entorno de desarrollo lo siguiente:

Requisito previo
notas

Descargue la última versión LTS o la última versión de lanzamiento.

Editor de código

Este tutorial utiliza Visual Studio Code, pero puedes usar el editor que prefieras.

Aplicación de terminal o shell

Para usuarios de macOS, usen Terminal o una aplicación similar. Para usuarios de Windows, usen PowerShell.

2

MongoDB Atlas es un servicio de base de datos en la nube totalmente administrado que aloja sus implementaciones de MongoDB. Si no tiene una implementación de MongoDB, puede crear un clúster de MongoDB gratis (sin tarjeta de crédito) completando el tutorial de introducción a MongoDB. Este tutorial también muestra cómo cargar conjuntos de datos de muestra en su clúster, incluyendo... sample_restaurants base de datos que se utiliza 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

Guarde su cadena de conexión en una ubicación segura.

3

Ejecute el siguiente comando en su terminal para crear una nueva aplicación Next.js.

npx create-next-app@latest next-quickstart

El comando le solicita que seleccione algunas opciones de configuración para su proyecto. Cuando se le solicite, seleccione la opción para usar los valores predeterminados recomendados.

Después de ejecutar el comando, navegue hasta el directorio del proyecto:

cd next-quickstart
4

Ejecute el siguiente comando para instalar el controlador MongoDB Node.js:

npm install mongodb

Este comando instala el controlador Node.js, que permite que su aplicación Next.js se conecte e interactúe con MongoDB.

Después de configurar la estructura y las dependencias del proyecto, siga los pasos de esta sección para configurar su conexión a la base de datos.

1

En el directorio next-quickstart, cree un archivo .env.local que almacene su URI de conexión MongoDB:

MONGODB_URI=<connection URI>

Reemplace <connection URI> el marcador de posición con la URI de conexión que guardó en un paso anterior.

Nota

Next.js carga automáticamente las variables de entorno desde los archivos .env.local. Las variables con el prefijo NEXT_PUBLIC_ se exponen al navegador, mientras que las demás solo están disponibles en el servidor.

2

En el directorio raíz, cree un nuevo directorio llamado lib. Añada un nuevo archivo llamado mongodb.ts a este directorio y pegue el siguiente código:

siguiente-inicio rápido/lib/mongodb.ts
import { MongoClient } from "mongodb";
declare global {
var _mongoClientPromise: Promise<MongoClient> | undefined;
}
const uri = process.env.MONGODB_URI;
const options = {};
let client: MongoClient;
let clientPromise: Promise<MongoClient>;
if (!uri) {
throw new Error("Please add your Mongo URI to .env.local");
}
client = new MongoClient(uri, options);
clientPromise = client.connect();
// Export a module-scoped MongoClient promise. By doing this in a
// separate module, the client can be shared across functions.
export default clientPromise;

Este archivo crea una conexión de cliente MongoDB reutilizable que se comparte en toda la aplicación. La conexión se almacena en caché para evitar la creación de múltiples conexiones durante el desarrollo cuando Next.js recarga el código en caliente.

Después de configurar la conexión a la base de datos, siga los pasos de esta sección para crear rutas API que consulten MongoDB y devuelvan datos del restaurante.

1

En el directorio app, cree un nuevo directorio api/restaurants. Añada un nuevo archivo llamado route.ts a este directorio y pegue el siguiente código:

siguiente-inicio rápido/aplicación/api/restaurantes/ruta.ts
import { NextResponse } from "next/server";
import clientPromise from "@/lib/mongodb";
export async function GET() {
try {
const client = await clientPromise;
const db = client.db("sample_restaurants");
const restaurants = await db
.collection("restaurants")
.find({})
.toArray();
return NextResponse.json(restaurants);
} catch {
return NextResponse.json(
{ error: "Failed to fetch restaurants" },
{ status: 500 }
);
}
}

Este archivo define un punto final GET en /api/restaurants que recupera todos los restaurantes de la base de datos sample_restaurants.

2

En el directorio app/api, cree un nuevo directorio llamado browse. Cree un nuevo archivo llamado route.ts en este directorio y pegue el siguiente código:

siguiente-inicio rápido/aplicación/api/explorar/ruta.ts
import { NextResponse } from "next/server";
import clientPromise from "@/lib/mongodb";
export async function GET() {
try {
const client = await clientPromise;
const db = client.db("sample_restaurants");
const query = {
borough: "Queens",
name: { $regex: "Moon", $options: "i" },
};
const restaurants = await db
.collection("restaurants")
.find(query)
.toArray();
return NextResponse.json(restaurants);
} catch {
return NextResponse.json(
{ error: "Failed to fetch restaurants" },
{ status: 500 }
);
}
}

Este archivo define un punto final GET en /api/browse que recupera los restaurantes que coinciden con criterios de consulta específicos. La consulta filtra los restaurantes en Queens que contienen la palabra "Moon" en el nombre.

Después de configurar las rutas de API, siga los pasos de esta sección para crear los componentes React que muestran los datos del restaurante.

1

En el directorio raíz, cree un nuevo directorio llamado components. Añada un nuevo archivo llamado Navbar.tsx a este directorio y pegue el siguiente código:

siguiente-inicio rápido/componentes/Navbar.tsx
import Link from "next/link";
export default function Navbar() {
return (
<nav className="bg-gray-800 p-4">
<div className="container mx-auto flex justify-between items-center">
<Link href="/" className="text-white text-xl font-bold">
MongoDB Restaurants
</Link>
<div className="space-x-4">
<Link
href="/"
className="text-gray-300 hover:text-white transition-colors"
>
All Restaurants
</Link>
<Link
href="/browse"
className="text-gray-300 hover:text-white transition-colors"
>
Filtered Restaurants
</Link>
</div>
</div>
</nav>
);
}

Este componente crea una barra de navegación con enlaces para ver todos los restaurantes y restaurantes filtrados.

2

En el directorio components, cree un nuevo archivo llamado RestaurantList.tsx y pegue el siguiente código:

siguiente-inicio-rápido/componentes/RestaurantList.tsx
"use client";
/* The above directive tells Next.js to render this component
on the client side instead of the server side.
Client components can use React hooks like useState
and useEffect, while server components cannot.
*/
import { useEffect, useState } from "react";
import { ObjectId } from "mongodb";
interface Restaurant {
_id: ObjectId;
name: string;
borough: string;
cuisine: string;
}
interface RestaurantProps {
restaurant: Restaurant;
}
const Restaurant = (props: RestaurantProps) => (
<tr className="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
<td className="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{props.restaurant.name}
</td>
<td className="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{props.restaurant.borough}
</td>
<td className="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{props.restaurant.cuisine}
</td>
</tr>
);
interface RestaurantListProps {
endpoint: string;
title: string;
}
export default function RestaurantList({ endpoint, title }: RestaurantListProps) {
const [restaurants, setRestaurants] = useState<Restaurant[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function getRestaurants() {
try {
const response = await fetch(endpoint);
if (!response.ok) {
const message = `An error occurred: ${response.statusText}`;
console.error(message);
return;
}
const restaurants = await response.json();
setRestaurants(restaurants);
} catch (error) {
console.error("Error fetching restaurants:", error);
} finally {
setLoading(false);
}
}
getRestaurants();
}, [endpoint]);
function restaurantList() {
return restaurants.map((restaurant) => {
return <Restaurant restaurant={restaurant} key={restaurant._id.toString()} />;
});
}
if (loading) {
return <div className="p-4">Loading...</div>;
}
return (
<>
<h3 className="text-lg font-semibold p-4">{title}</h3>
<div className="border rounded-lg overflow-hidden">
<div className="relative w-full overflow-auto">
<table className="w-full caption-bottom text-sm">
<thead className="[&_tr]:border-b">
<tr className="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
<th className="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Name
</th>
<th className="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Borough
</th>
<th className="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Cuisine
</th>
</tr>
</thead>
<tbody className="[&_tr:last-child]:border-0">
{restaurantList()}
</tbody>
</table>
</div>
</div>
</>
);
}

Este componente obtiene y muestra datos del restaurante desde las rutas de la API. Utiliza ganchos de React para gestionar el estado y obtener datos al montar el componente.

3

Navegue hasta el archivo app/page.tsx y reemplace el contenido con el siguiente código:

siguiente-inicio rápido/aplicación/página.tsx
import RestaurantList from "@/components/RestaurantList";
export default function Home() {
return (
<main className="container mx-auto p-4">
<RestaurantList
endpoint="/api/restaurants"
title="All Restaurants"
/>
</main>
);
}

Este archivo representa la página de inicio, que muestra todos los restaurantes de la base de datos.

4

En el directorio app, cree un nuevo directorio llamado browse. Añada un nuevo archivo llamado page.tsx a este directorio y pegue el siguiente código:

siguiente-inicio rápido/aplicación/explorar/página.tsx
import RestaurantList from "@/components/RestaurantList";
export default function Browse() {
return (
<main className="container mx-auto p-4">
<RestaurantList
endpoint="/api/browse"
title='Filtered Restaurants (Queens, containing "Moon")'
/>
</main>
);
}

Este archivo representa la página de exploración, que muestra restaurantes filtrados según los criterios de consulta.

5

Navegue hasta el archivo app/layout.tsx y reemplace el contenido con el siguiente código:

siguiente-inicio rápido/aplicación/diseño.tsx
import "./globals.css";
import Navbar from "@/components/Navbar";
import { Metadata } from "next";
export const metadata: Metadata = {
title: "MongoDB Next.js App",
description: "A Next.js application with MongoDB integration",
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<Navbar />
{children}
</body>
</html>
);
}

Este archivo define el diseño raíz de su aplicación, que incluye la barra de navegación y envuelve todas las páginas.

Por último, sigue los pasos de esta sección para ejecutar la aplicación y ver los datos del restaurante renderizados.

1

Navegue al directorio next-quickstart y ejecute el siguiente comando para iniciar el servidor de desarrollo Next.js:

npm run dev

Si es exitoso, este comando muestra la siguiente información:

▲ Next.js 15.1.6
- Local: http://localhost:3000
✓ Starting...
✓ Ready in 2.3s
2

Abra la URL http://localhost:3000 /. La página de destino inicial muestra una lista de todos los restaurantes de la sample_restaurants.restaurants colección:

La página de destino que muestra todos los restaurantes.

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:

La página web que muestra los restaurantes coincidentes

¡Felicitaciones por completar el tutorial de inicio rápido!

Después de completar estos pasos, tendrá una aplicación web Next.js que se conecta a su implementación de MongoDB, ejecuta consultas en datos de restaurantes de muestra y presenta los resultados en un sitio web alojado localmente.

Para obtener más información sobre Next.js y MongoDB, consulte los siguientes recursos:

Volver

Integración de TanStack

En esta página