Overview
En esta guía, aprenderá a crear una aplicación Meteor completa que utiliza Vue como framework front-end. Meteor es un framework JavaScript para crear aplicaciones web y móviles. Este framework es compatible con diversas bibliotecas front-end para crear la interfaz de usuario, incluyendo Vue.
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 aplicación: Meteor maneja la lógica tanto del lado del cliente como del servidor con herramientas de compilación integradas
Capa de presentación: Vue implementa la interfaz de usuario con enlace de datos reactivo
¿Por qué utilizar MongoDB con Meteor y Vue?
Meteor se basa en el modelo de documentos de MongoDB, y las aplicaciones Meteor configuran MongoDB por defecto. Puedes crear rápidamente una aplicación completa que almacene datos en MongoDB con mínimas instalaciones de dependencias o código repetitivo.
La estructura flexible de documentos de MongoDB se alinea de forma natural con los objetos JavaScript. Como resultado, puede trabajar sin problemas con los datos de MongoDB en sus componentes de Vue. Al usar Meteor para consultar MongoDB, los documentos que recibe pueden usarse directamente en sus plantillas de Vue sin necesidad de una transformación compleja de datos.
Además, Meteor ofrece sincronización de datos en tiempo real integrada que actualiza automáticamente los componentes de Vue cuando los datos cambian en MongoDB. Cuando un usuario modifica datos, todos los usuarios conectados ven los cambios al instante en sus interfaces de Vue, sin necesidad de actualizar ni consultar manualmente. Al usar MongoDB con Meteor y Vue, puede aprovechar las capacidades de sincronización de datos en tiempo real de Meteor junto con el sistema de componentes reactivos de Vue.
Tutorial de inicio rápido
Este tutorial muestra cómo crear una aplicación web con Meteor y Vue. 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 Meteor, consulte la 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 Atlas y configurar los directorios de la aplicación.
Verificar los prerrequisitos
Para crear la aplicación de inicio rápido, instale el siguiente software en su entorno de desarrollo:
Requisito previo | notas |
|---|---|
Utilice la versión 20 o posterior. | |
Editor de código | Este tutorial utiliza Visual Studio Code, pero puedes usar el editor que prefieras. |
Aplicación de terminal y shell | Para usuarios de macOS, usen Terminal o una aplicación similar. Para usuarios de Windows, usen PowerShell. |
Crear un clúster de MongoDB Atlas
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.
Tip
Guarde su cadena de conexión en una ubicación segura.
Instalar Meteor
Instale Meteor ejecutando el siguiente comando en su terminal:
npx meteor
Si encuentras algún problema, consulta la guía de instalación de Meteor.
Instalar el controlador MongoDB Node.js
Instale el controlador Node.js ejecutando el siguiente comando en su terminal:
npm install mongodb
Para obtener más información sobre cómo instalar el controlador, consulte la guía Introducción al controlador Node.js.
Limpiar la estructura del proyecto
Antes de agregar el código de la aplicación, elimine los archivos de plantilla innecesarios ejecutando los siguientes comandos desde su directorio meteor-vue-quickstart:
cd imports/ui rm components/AppMenu.vue components/Hello.vue components/Info.vue views/About.vue views/Home.vue
Esto remueve los componentes por defecto de la plantilla que la aplicación del restaurante no utiliza.
Configurar su conexión MongoDB
Después de configurar la estructura del proyecto, siga los pasos de esta sección para conectar su aplicación Meteor a MongoDB.
Proporcione su URI de conexión
Recupere la URI de conexión que guardó en un paso anterior.
Para acceder a la base de datos sample_restaurants, modifique la URI de conexión para incluir el nombre de la base de datos. Utilice el siguiente formato para actualizar la URI:
mongodb+srv://<username>:<password>@<cluster>/sample_restaurants?<options>
Luego, configure la variable de entorno MONGO_URL en esta URI de conexión modificada ejecutando el siguiente comando desde el directorio meteor-vue-quickstart:
export MONGO_URL="<connection URI>"
Reemplace el marcador de posición <connection URI> con su URI de conexión.
Acceda a la colección restaurants
En el directorio imports/api, crea un archivo llamado restaurantsCollection.js y pega el siguiente código:
import { Mongo } from 'meteor/mongo'; export const RestaurantsCollection = new Mongo.Collection('restaurants');
Este archivo accede y exporta la colección sample_restaurants.restaurants.
Configura publicaciones de datos
Cree un archivo llamado restaurantsPublications.js en el directorio imports/api y pegue el siguiente 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 archivo define las publicaciones de Meteor que permiten al cliente suscribirse a los datos de los restaurantes. Incluye las siguientes publicaciones:
restaurants: Publica todos los restaurantes, pero los limita a200para evitar problemas de rendimientorestaurants.filteredPublica restaurantes en Queens cuyo nombre tiene"Moon". El argumento$optionsespecifica que esta coincidencia de cadena de expresiones regulares no distingue entre mayúsculas y minúsculas.
Definir una operación de inserción
Cree un nuevo directorio llamado scripts y, a continuación, cree un archivo en este directorio llamado insertDemo.js. Pegue el siguiente código en 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 archivo define un método llamado insertSampleRestaurant(), que inserta un documento que almacena los siguientes campos:
name:"Honey Moon Coffee Shop"borough:"Queens"cuisine:"Café/Coffee/Tea"
Utilizará este archivo para demostrar las capacidades de sincronización de datos en tiempo real de Meteor en un paso futuro.
Actualizar la configuración del servidor
Reemplace el contenido de server/main.js con el siguiente 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 archivo importa las colecciones y publicaciones necesarias. También crea una función de inicio que verifica la conexión a MongoDB imprimiendo el número de documentos en la colección restaurants.
Configura los Componentes de Vue
Después de configurar la capa de datos, siga los pasos de esta sección para crear componentes de Vue que muestren los datos del restaurante.
Configurar enrutamiento
Navegue hasta el archivo imports/ui/router.js y pegue el siguiente 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 archivo configura las rutas de Vue y determina el contenido que se representará en cada una. La ruta / muestra todos los datos del restaurante y la ruta /browse muestra los datos filtrados.
Crear el Restaurant componente
En el directorio imports/ui/components, crea un archivo llamado Restaurant.vue que contenga el siguiente 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>
Este componente muestra información individual del restaurante como una fila en una tabla.
Crear la RestaurantList vista
En el directorio imports/ui/views, crea un archivo llamado RestaurantList.vue que contenga el siguiente 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 maneja la visualización de la lista de restaurantes y cambia automáticamente entre mostrar todos los restaurantes o resultados filtrados según la ruta actual.
Actualizar el App componenteprincipal
Reemplace el contenido de imports/ui/App.vue con el siguiente código:
<script setup> import { RouterView } from 'vue-router'; </script> <template> <div class="min-h-screen bg-gray-50"> <RouterView /> </div> </template>
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.
Ejecute su aplicación
Por último, sigue los pasos de esta sección para ejecutar la aplicación y ver los datos del restaurante renderizados.
Iniciar la Meteor aplicación
Navegue al directorio de su proyecto y ejecute el siguiente comando desde su terminal:
meteor npm run start
Si la operación es exitosa, la salida del comando se asemeja al siguiente ejemplo:
[[[[[ ~/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 la aplicación en su navegador
Abra http://localhost:3000/ en su navegador web. La página de inicio muestra una lista de 200 restaurantes sin filtrar en la sample_restaurants.restaurants colección:

En la parte superior de la página, haga clic en el Browse Filtered Botón para ver restaurantes en Queens que tienen "Moon" en su nombre:

Ver cambios de datos en tiempo real
Puede explorar las funciones de sincronización de datos en tiempo real de Meteor insertando un documento de muestra y viendo los cambios en el frontend de su aplicación.
Abra una segunda ventana de terminal y navegue al directorio de su proyecto. Exporte la URI de conexión de MongoDB ejecutando el mismo comando que se mostró en el paso anterior:
export MONGO_URL="<connection URI>"
Luego, ejecute el siguiente comando para insertar un documento de muestra que tenga un valor name de "Honey Moon Coffee Shop":
node scripts/insertDemo.js
Puede ver el nuevo documento en la Filtered Restaurants tabla en la URL http://localhost:3000/browse.
¡Felicitaciones por completar el tutorial de inicio rápido!
Después de completar estos pasos, tendrá una aplicación web Meteor y Vue que se conecta a su implementación de MongoDB, ejecuta consultas en datos de restaurantes de muestra y presenta los resultados con reactividad en tiempo real.
Recursos adicionales
Para obtener más información sobre Meteor, Vue y MongoDB, consulte los siguientes recursos:
Vue 3 documentation
vue-meteor-tracker package
Documentación delcontrolador Node.js