Visão geral
Neste guia, você pode aprender a criar um aplicação de pilha completa que usa Vue como framework front-end. O meteoro é um framework JavaScript para criar aplicativos web e móveis. Essa estrutura oferece suporte a uma variedade de bibliotecas de front-end para criar a interface do usuário, incluindo o Vue.
O aplicativo neste tutorial consiste nas seguintes camadas:
Camada de banco de dados: o MongoDB fornece armazenamento e recuperação de dados
Camada de aplicativo: o meteoro lida com a lógica do lado do cliente e do servidor com ferramentas de construção integradas
Camada de apresentação: o Vue implementa a interface do usuário com vinculação de dados reativa
Por que usar MongoDB com meteor e Vue?
O meteoro é baseado no modelo de documento do MongoDB, e os aplicativos do meteoro configuram o MongoDB por padrão. Você pode criar rapidamente um aplicação de pilha completa que armazena dados no MongoDB com instalações de dependência mínimas ou código boilerplate.
A estrutura flexível de documento do MongoDB se alinha naturalmente aos objetos JavaScript. Como resultado, você pode trabalhar perfeitamente com dados MongoDB em seus componentes Vue. Quando você usa o meteor para consultar o MongoDB, os documentos que você recebe podem ser usados diretamente em seus modelos Vue sem transformação complexa de dados.
Além disso, oMeteor fornece sincronização de dados integrada em tempo real que atualiza automaticamente seus componentes Vue quando os dados mudam no MongoDB. Quando um usuário modifica dados, todos os usuários conectados veem as alterações instantaneamente em suas interfaces Vue sem uma atualização manual ou pesquisa. Ao usar o MongoDB com o meteor e o vue, você pode aproveitar os recursos de sincronização de dados em tempo real do meteor e o sistema de componentes reativos do vue.
Tutorial de início rápido
Este tutorial mostra como construir um aplicação da web usando Monitor 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 meteoro, consulte o guia Introduçãoao driver Node.js
Configurar seu projeto
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.
Verifique os pré-requisitos
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 do MacOS, use o Terminal ou um aplicativo semelhante. Para usuários do Windows, use o PowerShell. |
Criar um cluster MongoDB Atlas
O MongoDB Atlas é um banco de dados em nuvem gerenciado que hospeda suas implantações do MongoDB. Se você não tiver uma implantação do MongoDB, poderá criar um cluster do MongoDB gratuitamente (nenhum cartão de crédito necessário) concluindo o tutorial MongoDB Get Started. O tutorial de Introdução ao MongoDB também demonstra como carregar conjuntos de dados de amostra em seu cluster, incluindo o banco de dados sample_restaurants usado neste tutorial.
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 em um local seguro.
Instalar o meteoro
Instale o meteoro executando o seguinte comando em seu terminal:
npx meteor
Se você encontrar algum problema, consulte o Guia de instalação do meteoro.
Instale o driver Node.js do MongoDB
Instale o driver Node.js executando o seguinte comando no seu terminal:
npm install mongodb
Para saber mais sobre como instalar o driver, consulte o guia Introdução ao driver Node.js
Limpe a estrutura do projeto
Antes de adicionar o código do aplicação , remova os arquivos de modelo desnecessários executando os seguintes comandos no diretório meteor-vue-quickstart:
cd imports/ui rm components/AppMenu.vue components/Hello.vue components/Info.vue views/About.vue views/Home.vue
Isso remove os componentes de modelo padrão que o aplicação do restaurante não usa.
Configurar sua conexão MongoDB
Após configurar a estrutura do projeto , siga as etapas nesta seção para conectar seu aplicação Monitor ao MongoDB.
Forneça seu URI de conexão
Recupere o URI de conexão que você salvou em uma etapa anterior.
Para acessar o banco de dados do sample_restaurants, modifique seu URI de conexão para incluir o nome do banco de dados . Use o seguinte formato para atualizar seu URI:
mongodb+srv://<username>:<password>@<cluster>/sample_restaurants?<options>
Em seguida, defina a variável de ambiente MONGO_URL para esse URI de conexão modificado executando o seguinte comando no diretório meteor-vue-quickstart:
export MONGO_URL="<connection URI>"
Substitua o espaço reservado <connection URI> pelo seu URI de conexão.
Acessar a restaurants coleção
No diretório imports/api, crie um arquivo denominado restaurantsCollection.js e cole o seguinte código:
import { Mongo } from 'meteor/mongo'; export const RestaurantsCollection = new Mongo.Collection('restaurants');
Este arquivo acessa e exporta a coleção sample_restaurants.restaurants.
Configurar publicações de dados
Crie um arquivo denominado restaurantsPublications.js no diretório imports/api e cole o seguinte código:
import { Meteor } from 'meteor/meteor'; import { RestaurantsCollection } from './restaurantsCollection'; // Publishes all restaurants Meteor.publish('restaurants', function publishRestaurants() { console.log('Publishing all restaurants...'); const cursor = RestaurantsCollection.find({}, { limit: 200 }); // Limit for performance console.log('Publication cursor created for all restaurants'); return cursor; }); // Publishes restaurants that match the "borough" and "name" filters Meteor.publish('restaurants.filtered', function publishFilteredRestaurants() { console.log('Publishing filtered restaurants...'); const query = { borough: 'Queens', name: { $regex: 'Moon', $options: 'i' } }; const cursor = RestaurantsCollection.find(query); console.log('Publication cursor created for filtered restaurants'); return cursor; });
Este arquivo define as publicações do meteoro que permitem ao cliente se inscrever nos dados do restaurante. Inclui as seguintes publicações:
restaurants: publica todos os restaurantes, mas limita-os a200para evitar problemas de desempenhorestaurants.filtered: publica restaurantes no Queins que têm"Moon"no nome. O argumento$optionsespecifica que essa correspondência de string regex não diferencia maiúsculas de minúsculas.
Definir uma operação de inserção
Crie um novo diretório denominado scripts e, em seguida, crie um arquivo neste diretório chamado insertDemo.js. Cole o seguinte código em insertDemo.js:
const { MongoClient } = require('mongodb'); const MONGO_URL = process.env.MONGO_URL; async function insertSampleRestaurant() { const client = new MongoClient(MONGO_URL); try { await client.connect(); const db = client.db(); const collection = db.collection('restaurants'); const doc = { name: "Honey Moon Coffee Shop", borough: "Queens", cuisine: "Café/Coffee/Tea", }; const result = await collection.insertOne(doc); console.log('Inserted restaurant with ID:', result.insertedId); } catch (error) { console.error('Error:', error); } finally { await client.close(); } } insertSampleRestaurant();
Este arquivo define um método denominado insertSampleRestaurant(), que insere um documento que armazena os seguintes campos:
name:"Honey Moon Coffee Shop"borough:"Queens"cuisine:"Café/Coffee/Tea"
Você usará este arquivo para demonstrar os recursos de sincronização de dados em tempo real do meteoro em uma etapa futura.
Atualize a configuração do servidor
Substitua o conteúdo de server/main.js pelo seguinte código:
import { Meteor } from 'meteor/meteor'; import { RestaurantsCollection } from '../imports/api/restaurantsCollection'; import '../imports/api/restaurantsPublications'; Meteor.startup(async () => { // Check connection to restaurants collection try { const restaurantCount = await RestaurantsCollection.find().countAsync(); console.log(`Connected to MongoDB Atlas. Found ${restaurantCount} restaurants in the collection`); } catch (error) { console.error('Error connecting to restaurants collection:', error); } });
Este arquivo importa as coleções e publicações necessárias. Ele também cria uma função de inicialização que verifica a conexão MongoDB imprimindo o número de documentos na coleção restaurants.
Configurar componentes Vue
Após configurar a camada de dados, siga as etapas nesta seção para criar componentes Vue que exibem os dados do restaurante.
Configurar roteamento
Navegue até o arquivo imports/ui/router.js e cole o seguinte código:
import { createRouter, createWebHistory } from 'vue-router'; import RestaurantList from './views/RestaurantList.vue'; export const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', name: 'home', component: RestaurantList, meta: { filter: false } }, { path: '/browse', name: 'browse', component: RestaurantList, meta: { filter: true } } ], });
Este arquivo configura as rotas Vue e determina qual conteúdo renderizar para cada uma delas. A rota / exibe todos os dados de restaurantes, e a rota /browse exibe dados de restaurantes filtrados.
Crie o Restaurant componente
No diretório imports/ui/components, crie um arquivo denominado Restaurant.vue que contém o seguinte código:
<script setup> defineProps({ restaurant: { type: Object, required: true, }, }); </script> <template> <tr class="border-b transition-colors hover:bg-gray-50"> <td class="p-4 align-middle">{{ restaurant.name }}</td> <td class="p-4 align-middle">{{ restaurant.borough }}</td> <td class="p-4 align-middle">{{ restaurant.cuisine }}</td> </tr> </template>
Esse componente exibe informações individuais do restaurante como uma linha em uma tabela.
Criar a RestaurantList visualização
No diretório imports/ui/views, crie um arquivo denominado RestaurantList.vue que contém o seguinte código:
<script setup> import Restaurant from '../components/Restaurant.vue'; import { subscribe, autorun } from 'vue-meteor-tracker'; import { RestaurantsCollection } from '../../api/restaurantsCollection'; import { useRoute, RouterLink } from 'vue-router'; import { computed } from 'vue'; const route = useRoute(); // Determines whether to show filtered results const isFiltered = computed(() => route.path === '/browse'); // Subscribes to both publications to avoid switching issues subscribe('restaurants'); subscribe('restaurants.filtered'); // Retrieves restaurants based on current route with client-side filtering as backup const restaurants = autorun(() => { let docs; if (isFiltered.value) { docs = RestaurantsCollection.find({ borough: 'Queens', name: { $regex: 'Moon', $options: 'i' } }).fetch(); console.log('Filtered restaurants found:', docs.length); } else { docs = RestaurantsCollection.find({}, { limit: 200 }).fetch(); console.log('All restaurants found:', docs.length); } return docs; }).result; // Determines the title based on the route const getTitle = computed(() => { return isFiltered.value ? 'Filtered Restaurants (Queens, containing "Moon")' : 'All Restaurants'; }); </script> <template> <div class="container mx-auto px-4"> <!-- Navigation --> <nav class="flex justify-between items-center mb-6 p-4 bg-white shadow rounded"> <div class="flex space-x-4"> <RouterLink to="/" class="px-4 py-2 text-blue-600 hover:bg-blue-50 rounded transition-colors" :class="{ 'bg-blue-100 font-semibold': !isFiltered }" > All Restaurants </RouterLink> <RouterLink to="/browse" class="px-4 py-2 text-blue-600 hover:bg-blue-50 rounded transition-colors" :class="{ 'bg-blue-100 font-semibold': isFiltered }" > Browse Filtered </RouterLink> </div> </nav> <!-- Header --> <header class="mb-6"> <h1 class="text-4xl font-bold text-gray-800 my-4">Restaurant Directory</h1> <h3 class="text-lg font-semibold text-gray-600">{{ getTitle }}</h3> </header> <!-- Restaurant Table --> <div class="border rounded-lg overflow-hidden shadow"> <div class="relative w-full overflow-auto"> <table class="w-full text-sm"> <thead class="bg-gray-100 border-b-2 border-gray-300"> <tr class="border-b-2 border-gray-400"> <th class="h-14 px-4 text-left align-middle font-bold text-gray-900 text-base tracking-wide"> Name </th> <th class="h-14 px-4 text-left align-middle font-bold text-gray-900 text-base tracking-wide"> Borough </th> <th class="h-14 px-4 text-left align-middle font-bold text-gray-900 text-base tracking-wide"> Cuisine </th> </tr> </thead> <tbody> <Restaurant v-for="restaurant in restaurants" :key="restaurant._id" :restaurant="restaurant" /> </tbody> </table> <!-- Empty state --> <div v-if="restaurants.length === 0" class="p-8 text-center text-gray-500"> <p>No restaurants found. Ensure that your connection URI is correct and includes the sample_restaurants database name.</p> <p v-if="isFiltered" class="text-sm mt-2"> Try the "All Restaurants" tab to see all available restaurants. </p> </div> </div> </div> <!-- Restaurant count --> <div class="mt-4 text-sm text-gray-600"> Showing {{ restaurants.length }} restaurant{{ restaurants.length !== 1 ? 's' : '' }} </div> </div> </template>
Este componente lida com a exibição da lista de restaurantes e alterna automaticamente entre a exibição de todos os restaurantes ou dos resultados filtrados com base na rota atual.
Atualize o App componente principal do
Substitua o conteúdo de imports/ui/App.vue pelo seguinte código:
<script setup> import { RouterView } from 'vue-router'; </script> <template> <div class="min-h-screen bg-gray-50"> <RouterView /> </div> </template>
Este é o principal componente do aplicação que inclui navegação e renderiza os componentes secundários apropriados com base na rota atual.
Execute seu aplicativo
Por fim, siga as etapas nesta seção para executar seu aplicativo e visualizar os dados renderizados do restaurante.
Inicie o Meteor aplicação
Navegue até o diretório do projeto e execute o seguinte comando a partir do seu terminal:
meteor npm run start
Se for bem-sucedida, a saída do comando será semelhante ao exemplo a seguir:
[[[[[ ~/meteor-vue-quickstart ]]]]] => Started proxy. => Started HMR server. ... Connected to MongoDB Atlas. Found 25368 restaurants in the collection => Started your app. => App running at: http://localhost:3000/
Abra o aplicação em seu navegador
Abra http://localhost:3000/ em seu navegador da web. A página de destino inicial exibe uma lista de 200 restaurantes não filtrados na sample_restaurants.restaurants coleção:

Na parte superior da página, clique no botão Browse Filtered para visualizar restaurantes no Queins que têm "Moon" em seu nome:

Visualizar alterações de dados em tempo real
Você pode explorar os recursos de sincronização de dados em tempo real do meteor inserindo um documento de exemplo e visualizando as alterações na interface do usuário do seu aplicativo.
Abra uma segunda janela do terminal e navegue até o diretório do projeto . Exporte seu URI de conexão MongoDB executando o mesmo comando mostrado na etapa anterior:
export MONGO_URL="<connection URI>"
Em seguida, execute o seguinte comando para inserir um documento de amostra que tenha um valor name de "Honey Moon Coffee Shop":
node scripts/insertDemo.js
Você pode visualizar o novo documento na Filtered Restaurants tabela no http://localhost:3000/browse URL.
Parabéns por concluir o tutorial de início rápido!
Depois de concluir essas etapas, você tem um aplicação web meteor e Vue que se conecta à implementação do MongoDB , executa queries em dados de restaurantes de amostra e renderiza os resultados com reatividade em tempo real.
Recursos adicionais
Para saber mais sobre meteor, Vue e MongoDB, consulte os seguintes recursos:
Vue 3 documentation
vue-meteor-tracker package