Overview
En este tutorial, crearás una función de Azure activada por HTTP que consulta datos de MongoDB Atlas mediante el controlador de MongoDB para Node.js. También aprenderás a gestionar las conexiones a la base de datos en un entorno sin servidor y a implementar tu función en la nube de Azure.
Requisitos previos
Antes de comenzar, sigue los siguientes pasos:
Implemente un clúster de MongoDB Atlas, configure el acceso a la red y los usuarios de la base de datos, y cargue los conjuntos de datos de ejemplo. Para obtener más información, consulte la MongoDB Get Started guía.
Instale y configure la CLI de Azure.
Instale y configure las herramientas principales de Azure Functions.
Instale Node.js versión 18 o posterior.
Tutorial
Este tutorial lo guía a través de los siguientes pasos:
Crear recursos en la nube de Azure.
Inicializa el proyecto local.
Instala el controlador de MongoDB para Node.js.
Configure la conexión a la base de datos
sample_mflixdatabase.Escribe una función para consultar la colección
sample_mflix.moviesy recuperar documentos que representen películas.Prueba la función localmente.
Implementar en Azure.
Crear recursos en la nube de Azure.
Ejecute el siguiente comando para crear un grupo de recursos, reemplazando <GROUP_NAME> por un nombre para su grupo y <AZURE_REGION> por una región de Azure compatible:
az group create \ --name <GROUP_NAME> \ --location <AZURE_REGION>
Opcionalmente, si utiliza Azure por primera vez, es posible que deba ejecutar los siguientes comandos para registrar el proveedor de recursos de Functions:
az provider register --namespace Microsoft.Storage az provider register --namespace Microsoft.Web
A continuación, ejecute el siguiente comando para crear una cuenta de almacenamiento. Utilice la misma región y nombre de grupo del código anterior y proporcione un nombre único para la cuenta de almacenamiento, reemplazando el marcador de posición <STORAGE_NAME> con este nombre único:
az storage account create \ --name <STORAGE_NAME> \ --location <AZURE_REGION> \ --resource-group <GROUP_NAME> \ --sku Standard_LRS
Finalmente, ejecute el siguiente comando para crear la aplicación de funciones:
az functionapp create \ --resource-group <GROUP_NAME> \ --consumption-plan-location <AZURE_REGION> \ --runtime node \ --functions-version 4 \ --name <APP_NAME> \ --storage-account <STORAGE_NAME>
Inicializa el proyecto local.
Ejecute el siguiente comando para inicializar un proyecto de función local:
func init MongoExample
Cuando se le solicite, seleccione node como entorno de ejecución del trabajador y javascript como idioma.
Ejecute los siguientes comandos para acceder al directorio del proyecto y crear una nueva función activada por HTTP:
cd MongoExample func new --name GetMovies --template "HTTP trigger"
El comando crea el archivo src/functions/GetMovies.js, que editarás en pasos posteriores.
Para vincular tu proyecto local con la aplicación de Azure Functions, ejecuta el siguiente comando desde el directorio del proyecto:
func azure functionapp fetch-app-settings <APP_NAME>
Este comando descarga todos los ajustes de la aplicación desde Azure, incluida la configuración de la cuenta de almacenamiento, y rellena el archivo local.settings.json de su proyecto.
Instale el controlador de MongoDB para Nodo.js.
Desde la raíz de tu proyecto, ejecuta el siguiente comando para instalar el controlador de MongoDB para Node.js:
npm install mongodb
Este comando agrega el controlador a su proyecto y lo registra en package.json para que el controlador esté disponible cuando lo implemente.
Configure la conexión con la base de datos.
Abre src/functions/GetMovies.js y reemplaza su contenido con el siguiente código:
const { app } = require("@azure/functions"); const { MongoClient } = require("mongodb"); const mongoClient = new MongoClient( process.env.MONGODB_ATLAS_URI ); app.http("GetMovies", { methods: ["GET"], authLevel: "anonymous", handler: async (request, context) => { // Query logic added in the next step } });
Tip
Defina mongoClient fuera de la función controladora para reutilizar las conexiones existentes entre invocaciones. Si crea una nueva conexión dentro de la controladora, cada invocación abrirá una nueva conexión y corre el riesgo de agotar el número máximo de conexiones simultáneas que admite su base de datos. Definir el cliente a nivel de módulo mantiene el número de conexiones proporcional al tráfico.
Dependiendo de tu versión de Node.js, es posible que encuentres un error relacionado con la resolución de DNS al intentar conectarte a MongoDB. Si esto ocurre, agrega el siguiente código a tu archivo src/functions/GetMovies.js antes de crear la instancia de MongoClient:
const { app } = require("@azure/functions"); const { MongoClient } = require("mongodb"); // Forces DNS servers explicitly before connecting to MongoDB require("node:dns/promises").setServers(["1.1.1.1", "8.8.8.8"]); const mongoClient = new MongoClient( process.env.MONGODB_ATLAS_URI ); app.http("GetMovies", { methods: ["GET"], authLevel: "anonymous", handler: async (request, context) => { // Query logic added in the next step } });
Abra local.settings.json y agregue los siguientes campos al objeto Values, reemplazando cada marcador de posición con sus valores reales:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "<storage-connection-string>", "FUNCTIONS_WORKER_RUNTIME": "node", "MONGODB_ATLAS_URI": "<atlas-connection-string>", "MONGODB_ATLAS_DATABASE": "sample_mflix", "MONGODB_ATLAS_COLLECTION": "movies" }, "ConnectionStrings": {} }
Para recuperar su cadena de conexión de MongoDB Atlas, navegue al panel de control de Atlas, seleccione su clúster y haga clic. ConnectPara obtener información sobre cómo recuperar la cadena de conexión de almacenamiento de Azure, consulte Configurar una cadena de conexión en la documentación de Azure.
Escribe una función para consultar MongoDB.
En src/functions/GetMovies.js, reemplace el comentario // Query logic added in the next step dentro del controlador con el siguiente código:
try { const database = mongoClient.db( process.env.MONGODB_ATLAS_DATABASE ); const collection = database.collection( process.env.MONGODB_ATLAS_COLLECTION ); const results = await collection .find({}) .limit(10) .toArray(); return { jsonBody: results }; } catch (error) { return { status: 500, jsonBody: { message: "Internal server error." } }; }
Cuando la función recibe una solicitud, se conecta a la base de datos y a la colección especificadas por las variables de entorno y devuelve hasta 10 documentos. Si se produce un error, la función devuelve una respuesta 500 que contiene el mensaje de error.
Prueba la función localmente.
Desde la raíz de tu proyecto, ejecuta el siguiente comando para iniciar tu función:
func start
Cuando se inicia el servidor, la interfaz de línea de comandos (CLI) muestra la URL local de tu función. Accede a http://localhost:7071/api/GetMovies en tu navegador o envía una solicitud utilizando una herramienta como cURL o Postman.
Nota
Si el servidor se inicia pero no puede recuperar datos, verifique que su dirección IP local esté incluida en la lista de acceso a la red de Atlas. Las reglas de IP del centro de datos de Azure que configuró para producción no se aplican al realizar pruebas localmente. Para obtener más información, consulte Configurar entradas de la lista de acceso a IP.
Implementar en Azure.
Configure sus variables de entorno en Azure ejecutando los siguientes comandos, reemplazando cada marcador de posición con sus valores reales:
az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_URI=<atlas-connection-string> az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_DATABASE=sample_mflix az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_COLLECTION=movies
Implementa tu función ejecutando el siguiente comando:
func azure functionapp publish <APP_NAME>
Deployment successful. Remote build succeeded! Syncing triggers... Functions in <APP_NAME>: GetMovies - [httpTrigger] Invoke url: https://<APP_NAME>.azurewebsites.net/api/getmovies
Cuando finaliza el despliegue, la CLI muestra una URL pública para su función. Dado que la función utiliza authLevel: "anonymous", se puede acceder a ella sin necesidad de una clave.
Nota
Para implementaciones en producción, considere cambiar authLevel por "function" o "admin" y distribuir la clave correspondiente a los clientes autorizados. Para obtener más información, consulte la documentación sobre cómo trabajar con claves de acceso en Azure Functions.
Obtén más información
Para obtener más información sobre los conceptos abordados en este tutorial, consulta los siguientes recursos:
Consulte la sección "Administrar conexiones con Azure Functions" en la documentación de Atlas para obtener información sobre las mejores prácticas de conexión.
Consulta la documentación de Azure Functions para obtener más información sobre Functions.