Menu Docs
Página inicial do Docs
/ /

Integre o MongoDB com Nuxt e Vue

Este tutorial mostra como criar um aplicação Nuxt que usa Vue e se integra ao MongoDB. O Nuxt é um framework Vue que fornece roteamento baseado em arquivos, renderização do lado do servidor e rotas de API integradas por meio de seu mecanismo de servidor Nitro. O Nuxt combinado com o Vue permite criar aplicativos completos sem um servidor backend separado.

O aplicação neste tutorial contém as seguintes camadas:

  • Camada de banco de dados: o MongoDB fornece armazenamento e recuperação de dados

  • Camada do servidor: as rotas do servidor Nuxt lidam com a lógica da API e as interações do banco de dados

  • Camada de apresentação: o Vue implementa a interface do usuário com vinculação de dados reativa

O Nuxt se baseia no Vue para fornecer uma estrutura de pilha completa com um tempo de execução do Node.js para rotas de servidor , tornando-o um ajuste natural para o driver do MongoDB Node.js Você pode se conectar ao MongoDB diretamente das rotas do servidor Nuxt ou dos utilitários do lado do servidor e retornar documentos para os componentes do Vue sem manter um serviço de backend ou uma camada de API separada.

A estrutura flexível de documento do MongoDB mapeia facilmente para objetos JavaScript. Como resultado, você pode trabalhar perfeitamente com dados do MongoDB em seus componentes Vue, esteja usando a API de opções ou a API de composição. Os documentos que você obtém do MongoDB podem ser passados diretamente para seus componentes e modelos, reduzindo a necessidade de transformação de dados complexa ou de uma camada adicional de mapeamento objeto-relacional (ORM).

A renderização no lado do servidor (SSR) do Nuxt e os utilitários de busca de dados permitem consultar o MongoDB no servidor antes de renderizar páginas. Isso permite que você umedeça seus componentes do Vue com dados prontos para uso, melhorando o desempenho percebido e o oseo para aplicativos orientados por dados.

Este tutorial mostra como construir um aplicação da web usando Nuxt e Vue. O aplicação acessa dados de restaurantes de amostra, consulta os dados e exibe os resultados em um site hospedado localmente. O tutorial também inclui instruções sobre como se conectar a um cluster MongoDB hospedado no MongoDB Atlas e acessar e exibir dados de seu banco de dados.

Dica

Se você preferir se conectar ao MongoDB usando o driver Node.js sem o Nuxt, consulte o guia Introduçãoao driver Node.js

Siga as etapas nesta seção para instalar as dependências do projeto, criar um cluster do Atlas e configurar os diretórios do aplicativo.

1

Para criar o aplicativo Quick Start, instale o seguinte software em seu ambiente de desenvolvimento:

Pré-requisitos

Notas

Use a versão 20 ou posterior.

Editor de código

Este tutorial utiliza Visual Studio Code, mas você pode utilizar o editor de sua escolha.

Aplicativo de terminal e shell

Para usuários de macOS ou Linux, use o Terminal ou um aplicativo semelhante. Para usuários do Windows, use o PowerShell.

2

O MongoDB Atlas é um serviço de banco de dados de nuvem totalmente gerenciado que hospeda suas implementações do MongoDB . Se você não tiver uma implementação do MongoDB , poderá criar um cluster do MongoDB gratuitamente (nenhum cartão de crédito necessário) concluindo o tutorial de Introdução ao MongoDB .

Dica

Certifique-se de que o sample_restaurants conjunto de dados do esteja carregado em seu cluster. Este tutorial query dados desse conjunto de dados. Para saber como carregar o sample_restaurants conjunto de dados do em seu cluster, consulte o tutorial de Introdução ao MongoDB .

Para se conectar ao cluster MongoDB, você deve usar um URI de conexão. Para aprender como recuperar seu URI de conexão, veja a seção Adicionar sua string de conexão do tutorial de Introdução ao MongoDB.

Dica

Salve sua string de conexão do MongoDB Atlas em um local seguro. Você o adicionará ao seu arquivo .env em uma etapa posterior.

3

Use a CLI oficial do Nuxt para inicializar um novo projeto do Nuxt com o Vue. Abra o terminal e navegue até o diretório de projeto desejado.

Execute o comando de inicialização:

npm create nuxt@latest

A CLI solicita que você configure seu projeto. Use as seguintes respostas:

  1. Prompt: É necessário instalar os seguintes pacotes: create-nuxt@latest-number. Ok para continuar?

    Resposta: Digite y e pressione Enter.

  2. Solicitação: qual modelo você gostaria de usar?

    Resposta: minimal - Minimal setup for Nuxt 4 (recommended)Selecione.

  3. Solicitação: onde você gostaria de criar seu projeto?

    Resposta: Pressione Enter para aceitar o diretório padrão ou digite um caminho diferente.

  4. Prompt: Qual gerenciador de pacote você gostaria de usar?

    Resposta: npmSelecione.

  5. Prompt: Inicializar repositório git?

    Resposta: Yes No Selecione ou com base em sua preferência.

  6. Solicitação: deseja instalar algum dos módulos oficiais?

    Resposta: NoSelecione.

4

Navegue até o diretório do projeto e instale o driver MongoDB , os ícones Lude, Tailwind e dependências relacionadas executando os seguintes comandos:

npm install mongodb lucide-vue-next
npm install -D @types/node @nuxtjs/tailwindcss

Você pode ignorar com segurança quaisquer avisos sobre pacotes obsoletos da instalação do Tailwind.

Após configurar a estrutura do projeto , siga as etapas desta seção para configurar o backend.

1

Crie um arquivo .env na raiz do seu projeto para armazenar com segurança o URI de conexão, executando o seguinte comando na raiz do projeto :

touch .env

Abra o arquivo .env e adicione seu URI de conexão:

MONGODB_URI=<Your Connection URI>

Observação

Substitua <Your Connection URI> pelo URI de conexão que você recebeu do MongoDB Atlas.

2

Abra o arquivo nuxt.config.ts na raiz do projeto e substitua seu conteúdo pelo código a seguir para carregar as variáveis de ambiente e configurar o módulo CSS do Tailwind:

nuxt.config.ts
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2025-07-15',
devtools: { enabled: true },
future:{
compatibilityVersion: 4,
},
runtimeConfig:{
// Server-side only config. Not exposed to the client
mongoURI: process.env.MONGODB_URI,
},
css:['@/assets/css/main.css'],
modules: ['@nuxtjs/tailwindcss'],
})

O arquivo nuxt.config.ts carrega variáveis de ambiente do arquivo .env e configura o suporte do Tailwind para estilizar seus componentes Vue.

3

Execute os seguintes comandos na raiz do seu projeto para criar um arquivo de utilitário para manter a lógica de conexão MongoDB :

mkdir -p server/utils
touch server/utils/mongodb.ts

Abra o arquivo server/utils/mongodb.ts e adicione o seguinte código:

servidor/utils/mongodb.ts
import { MongoClient, type Db } from "mongodb";
let cachedClient: MongoClient | null = null;
let cachedDb: Db | null = null;
export async function connectToDatabase(){
if (cachedClient && cachedDb){
return { client: cachedClient, db: cachedDb };
}
const config = useRuntimeConfig();
const uri = config.mongoURI;
if (!uri){
throw new Error("Please define the MONGO_URI environment variable inside .env");
}
const client = new MongoClient(uri);
await client.connect();
const db = client.db("sample_restaurants");
cachedClient = client;
cachedDb = db;
console.log("Connected to MongoDB Atlas");
return { client, db };
}

Esse código cria um cliente MongoDB reutilizável que se conecta ao seu Atlas cluster usando o URI de conexão armazenado em sua variável de ambiente. O cliente se conecta ao banco de dados sample_restaurants , que contém informações sobre restaurantes nos EUA.

4

As rotas do servidor Nuxt lidam com solicitações de API e interagem com o banco de dados. Execute os seguintes comandos na raiz do seu projeto para criar uma rota de servidor para buscar dados do restaurante:

mkdir -p server/api/restaurants
touch server/api/restaurants/index.get.ts

Abra o arquivo server/api/restaurants/index.get.ts e adicione o seguinte código:

servidor/api/restaurants/index.get.ts
import { connectToDatabase } from "~~/server/utils/mongodb";
export default defineEventHandler(async () =>{
const { db } = await connectToDatabase();
const collection = db.collection("restaurants");
const restaurants = await collection
.find({})
.limit(50)
.project({ name: 1, borough: 1, cuisine: 1, grades: 1})
.toArray();
return restaurants.map((doc) => ({
...doc,
_id: doc._id.toString(),
}))
})

Este arquivo define uma rota de servidor que consulta a coleção restaurants. Ele recupera os primeiros 50 documentos do restaurante e os retorna como uma resposta JSON.

5

Execute o seguinte comando na raiz do seu projeto para criar o novo arquivo de rota:

touch server/api/restaurants/browse.get.ts

Abra o arquivo server/api/restaurants/browse.get.ts e adicione o seguinte código:

servidor/api/restaurants/browse.get.ts
import { connectToDatabase } from '~~/server/utils/mongodb'
export default defineEventHandler(async () => {
const { db } = await connectToDatabase();
const collection = db.collection("restaurants");
// Filter: Queens borough + name contains "Moon" (case-insensitive)
const query = {
borough: 'Queens',
name: { $regex: 'Moon', $options: 'i' },
}
const restaurants = await collection
.find(query)
.project({ name: 1, borough: 1, cuisine: 1, grades: 1 })
.toArray()
return restaurants.map((doc) => ({
...doc,
_id: doc._id.toString(),
}))
})

Este arquivo define uma rota de servidor que consulta o banco de dados do sample_restaurants para restaurantes no Queens cujos nomes contêm a palavra Moon e retorna os documentos correspondentes como uma resposta JSON.

Após configurar o backend, siga as etapas nesta seção para configurar a camada de apresentação do seu aplicação.

1

Execute o seguinte comando na raiz do seu projeto para criar um arquivo CSS principal para estilos globais:

mkdir -p app/assets/css
touch app/assets/css/main.css

Abra o arquivo app/assets/css/main.css e adicione o seguinte código:

app/assets/css/main.css
@tailwind base;
@tailwind components;
@tailwind utilities;

Este arquivo importa diretivas CSS do Tailwind que geram classes de utilitários para estilizar seu aplicação. O Tailwind fornece um conjunto abrangente de classes pré-criadas para layout, espaçamento, cores e tipoografia sem exigir CSS personalizado.

2

Execute os seguintes comandos na raiz do seu projeto para criar um componente Vue para exibir dados do restaurante:

mkdir -p app/components
touch app/components/RestaurantList.vue

Abra o arquivo app/components/RestaurantList.vue e adicione o seguinte código:

app/components/RestaurantList.vue
<script setup lang="ts">
import { computed } from 'vue'
import { MapPin, Utensils, ChevronRight } from 'lucide-vue-next'
// Type definitions
interface Grade {
grade?: string
score?: number
}
interface Restaurant {
_id: string
name: string
borough?: string
cuisine?: string
grades?: Grade[]
}
// Determine endpoint based on current route
const route = useRoute()
const isBrowse = computed(() => route.path === '/browse')
const endpoint = computed(() =>
isBrowse.value ? '/api/restaurants/browse' : '/api/restaurants'
)
// Fetch data using Nuxt's useFetch composable
// Automatically refetches when endpoint changes
const { data: restaurants } = await useFetch<Restaurant[]>(endpoint, {
watch: [endpoint],
default: () => [],
})
// Dynamic page content
const pageTitle = computed(() =>
isBrowse.value ? 'Hidden Gems in Queens' : 'All Restaurants'
)
const pageSubtitle = computed(() =>
isBrowse.value
? "Filtered by: Borough 'Queens' & Name contains 'Moon'"
: 'Explore our complete directory of local favorites'
)
// Deterministic gradient based on name length
const getGradient = (name: string) => {
const gradients = [
'from-orange-400 to-pink-500',
'from-blue-400 to-indigo-500',
'from-green-400 to-emerald-500',
'from-purple-400 to-fuchsia-500',
]
return gradients[name.length % gradients.length]
}
</script>
<template>
<div class="max-w-6xl mx-auto px-4 py-8">
<!-- Header -->
<div class="mb-8">
<h3 class="text-3xl font-bold text-gray-800">
{{ pageTitle }}
</h3>
<p class="text-gray-500 mt-2">
{{ pageSubtitle }}
</p>
</div>
<!-- Restaurant Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div
v-for="restaurant in restaurants"
:key="restaurant._id"
class="group bg-white rounded-2xl border border-gray-100 shadow-sm hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden flex flex-col"
>
<!-- Gradient Header -->
<div
:class="[
'h-32 bg-gradient-to-br p-6 flex items-end relative',
getGradient(restaurant.name)
]"
>
<span class="absolute top-4 right-4 bg-white/20 backdrop-blur-md text-white text-xs font-bold px-2 py-1 rounded-full border border-white/30">
Grade {{ restaurant.grades?.[0]?.grade ?? 'N/A' }}
</span>
<h3 class="text-white text-xl font-bold drop-shadow-md line-clamp-2">
{{ restaurant.name }}
</h3>
</div>
<!-- Card Body -->
<div class="p-5 flex-1 flex flex-col">
<div class="flex items-center justify-between mb-4">
<span class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md text-xs font-medium bg-green-50 text-green-700 border border-green-100">
<Utensils class="w-3 h-3" />
{{ restaurant.cuisine ?? 'Unknown' }}
</span>
<div class="flex items-center text-gray-400 text-xs font-medium">
<MapPin class="w-3 h-3 mr-1" />
{{ restaurant.borough ?? 'Unknown' }}
</div>
</div>
<div class="mt-auto pt-4 border-t border-gray-50 flex items-center justify-between text-sm">
<span class="text-gray-400">
Score: {{ restaurant.grades?.[0]?.score ?? 0 }}
</span>
<button class="text-indigo-600 font-semibold group-hover:underline flex items-center gap-1">
View Menu <ChevronRight class="w-4 h-4" />
</button>
</div>
</div>
</div>
</div>
<!-- Empty State -->
<div v-if="restaurants?.length === 0" class="text-center py-12 text-gray-500">
<p>No restaurants found.</p>
<p class="text-sm mt-2">Check your MongoDB connection and ensure the sample_restaurants database is loaded.</p>
</div>
</div>
</template>

Esse componente Vue obtém dados de restaurante de sua rota de servidor Nuxt e os exibe em um layout de grade responsivo. Ele adapta dinamicamente o endpoint da API e o conteúdo da página com base na rota atual, mostrando todos os restaurantes ou resultados filtrados.

3

Execute o seguinte comando na raiz do seu projeto para criar um componente Vue para a barra de navegação:

touch app/components/Navbar.vue

Abra o arquivo app/components/Navbar.vue e adicione o seguinte código:

app/components/Navbar.vue
<template>
<nav class="flex justify-between items-center mb-6 bg-white shadow-md px-6 py-4 rounded-lg">
<NuxtLink to="/">
<img
alt="MongoDB logo"
class="h-10"
src="https://d3cy9zhslanhfa.cloudfront.net/media/3800C044-6298-4575-A05D5C6B7623EE37/4B45D0EC-3482-4759-82DA37D8EA07D229/webimage-8A27671A-8A53-45DC-89D7BF8537F15A0D.png"
/>
</NuxtLink>
<div class="flex gap-4">
<NuxtLink
to="/"
class="px-4 py-2 rounded-lg text-sm font-medium transition-colors"
:class="$route.path === '/'
? 'bg-indigo-100 text-indigo-700'
: 'text-gray-600 hover:bg-gray-100'"
>
All Restaurants
</NuxtLink>
<NuxtLink
to="/browse"
class="px-4 py-2 rounded-lg text-sm font-medium transition-colors"
:class="$route.path === '/browse'
? 'bg-indigo-100 text-indigo-700'
: 'text-gray-600 hover:bg-gray-100'"
>
Browse Filtered
</NuxtLink>
</div>
</nav>
</template>

Esse componente Vue renderiza a barra de navegação acima dos resultados do restaurante e contém os links All Restaurants e Filtered Restaurants. Eles permitem que você navegue entre as rotas.

4

Execute o seguinte comando na raiz do seu projeto para criar uma página de índice para o aplicação:

mkdir -p app/pages
touch app/pages/index.vue

Abra o arquivo app/pages/index.vue e adicione o seguinte código:

app/pages/index.vue
<template>
<RestaurantList />
</template>

Este arquivo exibe os resultados da rota do servidor index.get.ts utilizando os componentes RestaurantList e Navbar.

5

Execute o seguinte comando na raiz do projeto para criar uma nova página Vue para exibir dados de restaurante filtrados:

touch app/pages/browse.vue

Abra o arquivo app/pages/browse.vue e adicione o seguinte código:

app/pages/browse.vue
<template>
<RestaurantList />
</template>

Este arquivo exibe os resultados de uma query filtrada no banco de dados sample_restaurants que retorna todos os restaurantes em Queens com nomes que contêm a palavra Moon. Ele também utiliza os componentes RestaurantList e Navbar para construir a página.

6

Abra o arquivo app/App.vue e substitua seu conteúdo pelo seguinte código para conectar os componentes:

app/app.vue
<template>
<div class="w-full p-6 min-h-screen bg-gray-50">
<Navbar />
<NuxtPage />
</div>
</template>
7

Antes de continuar, verifique se sua árvore de arquivos corresponde corretamente à estrutura abaixo. Você pode ignorar com segurança quaisquer arquivos de projeto adicionais.

your-project-directory/
├── .env <-- Environment variable file
├── app/
│ ├── app.vue <-- Main application component
│ ├── assets/
│ │ └── css/
│ │ └── main.css <-- Tailwind config
│ ├── components/
│ │ ├── Navbar.vue <-- All restaurants and filtered restaurants links
│ │ └── RestaurantList.vue <-- Container for restaurant data
│ └── pages/
│ ├── browse.vue <-- Filtered restaurants page
│ └── index.vue <-- All restaurants page
├── server/
│ ├── api/
│ │ └── restaurants/
│ │ ├── browse.get.ts <-- Filtered restaurants route
│ │ └── index.get.ts <-- All restaurants route
│ └── utils/
│ └── mongodb.ts <-- MongoDB connection utility
├── nuxt.config.ts <-- Nuxt configuration file
└── package.json

Execute as etapas a seguir para iniciar o servidor e visualizar os dados do restaurante renderizados.

1

Execute o seguinte comando na raiz do seu projeto para iniciar o servidor de desenvolvimento:

npm run dev

Se bem-sucedido, o comando gera as seguintes informações no terminal:

Nuxt 4.2.2 (with Nitro 2.13.1, Vite 7.3.1 and Vue 3.5.27)
Local: http://localhost:3000/
Network: use --host to expose
Using default Tailwind CSS file
DevTools: press Shift + Option + D in the browser (v3.1.1)
Vite client built in 22ms
Vite server built in 19ms
Nuxt Nitro server built in 247ms
Vite server warmed up in 0ms
Vite client warmed up in 1ms
Connected to MongoDB Atlas
2

Abra http://localhost:3000/ no seu navegador. A página de destino inicial exibe os primeiros 50 restaurantes no banco de dados sample_restaurants.

O aplicativo de destino que exibe os primeiros 50 restaurantes no banco de dados sample_restaurants .
3

Clique no link Filtered Restaurants na barra de navegação para visualizar os resultados filtrados do restaurante. A página exibe todos os restaurantes em Queens com nomes que contêm a palavra Moon.

A página de restaurantes filtrada que exibe todos os restaurantes no Queins com nomes que contêm a palavra Series.

Parabéns por concluir o tutorial de início rápido!

Depois de concluir essas etapas, você tem um aplicação Nuxt e Vue que se conecta à implementação do MongoDB , executa queries em dados de restaurantes de amostra e renderiza os resultados em seu navegador.

Para saber mais sobre como usar MongoDB, Nuxt e Vue, visualize os seguintes recursos:

Voltar

Integração de meteor e Vue

Nesta página