Docs Menu
Docs Home
/ /

Funciones del Atlas

Una función Atlas es un fragmento de código JavaScript del lado del servidor que se escribe para definir el comportamiento de la aplicación. Puedes llamar a las funciones de la aplicación directamente desde una aplicación cliente o definir servicios que las integren y las llamen automáticamente.

Las funciones pueden llamar a otras funciones e incluyen un cliente integrado para trabajar con datos en clústeres de MongoDB Atlas. También incluyen útiles utilidades globales, son compatibles con módulos integrados comunes de Node.js y permiten importar y usar paquetes externos desde el registro de npm.

Una Function básica que devuelve un saludo
exports = function(name) {
return `Hello, ${name ?? "stranger"}!`
}

Las funciones no tienen servidor

Cuando se llama a una función, la aplicación dirige la solicitud a un servidor de aplicaciones administrado que evalúa el código y devuelve el resultado. Este modelo permite que las funciones funcionen sin servidor, lo que significa que no es necesario implementar ni administrar un servidor para ejecutar el código. En su lugar, se escribe el código fuente de la función y la aplicación gestiona el entorno de ejecución.

Las funciones tienen contexto

Una función se ejecuta en un contexto que refleja su entorno de ejecución. El contexto incluye el usuario que la llamó, cómo la llamó y el estado de la aplicación en ese momento. Puedes usar el contexto para ejecutar código específico del usuario y trabajar con otras partes de la aplicación.

Para obtener más información sobre cómo trabajar con el contexto de función, consulte Contexto.

Las funciones pueden llamar a servicios externos

Puede crear una función que realice solicitudes HTTP salientes (por ejemplo, utilizando el http paquete externo) para acceder a datos fuera de su organización para usarlos dentro de su función.

Nota

Direcciones IP de salida

Un servicio externo puede tener un firewall que limita el acceso a llamadas desde ciertas direcciones IP. En este caso, deberá configurar la lista de IP aprobadas para ese servicio. Para obtener más información, consulte Acceso IP saliente de seguridad de funciones.

Las funciones pueden ejecutar cualquier código JavaScript que definas, lo que significa que puedes utilizarlas para casi cualquier cosa. Los casos de uso comunes incluyen tareas de baja latencia y corta duración, como movimiento de datos, transformaciones y validación. También puedes usarlas para conectarte a servicios externos y abstraer detalles de implementación de tus aplicaciones cliente.

Los disparadores invocan automáticamente funciones para gestionar eventos específicos. Por ejemplo, cuando un disparador de base de datos detecta un evento de cambio, invoca su función asociada con dicho evento como argumento. En la función del disparador, se puede acceder a la información del evento de cambio y responder adecuadamente.

Nota

Los activadores de base de datos y programados siempre se ejecutan en el contexto de un usuario del sistema.

El código de una función es básicamente un archivo fuente JavaScript con nombre, lo que significa que se pueden definir varias funciones JavaScript en un solo archivo. El archivo debe exportar una sola función JavaScript que sirva como punto de entrada para las llamadas entrantes. Al llamar a una función por su nombre, se llama a la función JavaScript asignada a exports en el archivo fuente de la función.

Por ejemplo, aquí hay una función simple que acepta un argumento name, agrega un mensaje de registro y devuelve un saludo para el nombre proporcionado:

exports = function Hello(name) {
console.log(`Said hello to ${name}`);
return `Hello, ${name}!`;
};

Puedes utilizar la sintaxis moderna de JavaScript e importar paquetes para definir funciones más complejas:

// You can use ES6 arrow functions
const uppercase = (str) => {
return str.toUpperCase();
};
// You can use async functions and await Promises
exports = async function GetWeather() {
// You can get information about the user called the function
const city = context.user.custom_data.city;
// You can import Node.js built-ins and npm packages
const { URL } = require("url");
const weatherUrl = new URL("https://example.com");
weatherUrl.pathname = "/weather";
weatherUrl.search = `?location="${city}"`;
// You can send HTTPS requests to external services
const weatherResponse = await context.http.get({
url: url.toString(),
headers: {
Accept: ["application/json"],
},
});
const { current, forecasts } = JSON.parse(weatherResponse.body.text());
return [
`Right now ${uppercase(city)} is ${current.temperature}°F and ${current.weather}.`,
`Here's the forecast for the next 7 days:`,
forecasts
.map((f) => `${f.day}: ${f.temperature}°F and ${f.weather}`)
.join("\n "),
].join("\n");
};
Right now NEW YORK CITY is 72°F and sunny.
Here's the forecast for the next 7 days:
Tuesday: 71°F and sunny
Wednesday: 72°F and sunny
Thursday: 73°F and partly cloudy
Friday: 71°F and rainy
Saturday: 77°F and sunny
Sunday: 76°F and sunny
Monday: 74°F and sunny

Las funciones serializan automáticamente los valores devueltos a JSON extendido. Esto es útil para preservar la información de tipo, pero puede no ser lo que tu aplicación espera.

Por ejemplo, los valores del objeto devuelto por la siguiente función se convierten en valores EJSON estructurados:

exports = function() {
return {
pi: 3.14159,
today: new Date(),
}
}
{
"pi": {
"$numberDouble": "3.14159"
},
"today": {
"$date": {
"$numberLong": "1652297239913"
}
}
}

Para devolver un valor como JSON estándar, llame a JSON.stringify() en el valor y luego devuelva el resultado en formato cadena:

exports = function() {
return JSON.stringify({
pi: 3.14159,
today: new Date(),
})
}
"{\"pi\":3.14159,\"today\":\"2022-05-11T19:27:32.207Z\"}"

Puede crear y administrar funciones en su aplicación desde la interfaz de usuario de Atlas o importando la configuración de la función y el código fuente mediante la CLI de App Services o la implementación de GitHub.

Puede definir una nueva función del lado del servidor desde la interfaz de usuario de Atlas:

1
  1. Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Triggers en la sección Streaming Data.

Se muestra la página Desencadenantes.

2
  1. Haga clic en el enlace Linked App Service: Triggers.

  2. En la barra lateral, haz clic en Functions en la sección Build.

  3. Haga clic en Create a Function. La pestaña Settings se muestra de forma predeterminada.

3

Introduzca un nombre para la función en el campo Name. Este nombre debe ser único respecto a las demás funciones de la aplicación.

Tip

Puedes definir funciones dentro de carpetas anidadas. Los nombres de las funciones son rutas separadas por barras, por lo que una función llamada utils/add se asigna a functions/utils/add.js en los archivos de configuración de la aplicación.

4

Las funciones en Atlas siempre se ejecutan en el contexto de un usuario específico de la aplicación o como un usuario del sistema que omite las reglas. Para configurar el usuario de ejecución de la función, especifique el tipo de autenticación que Atlas debe usar.

Nota

Las funciones para base de datos y disparadores programados siempre se ejecutan en el contexto de un usuario del sistema.

Tipo de autenticación
Descripción

Autenticación de aplicaciones (obsoleta)

Obsoleto. Este tipo de autenticación configura una función para ejecutarse en el contexto del usuario de la aplicación existente que inició sesión cuando la aplicación cliente llamó a la función. Si la función fue llamada desde otra función, entonces hereda el usuario de ejecución de esa función.

Sistema

Este tipo de autenticación configura una función para ejecutarse como un usuario del sistema que tiene acceso completo a las API de CRUD y agregación de MongoDB y no se ve afectado por ninguna regla, rol o permiso.

ID de usuario (obsoleto)

Obsoleto. Este tipo de autenticación configura una función para que siempre se ejecute como un usuario específico de la aplicación.

Guión

Este tipo de autenticación configura una función para que se ejecute como un usuario específico de la aplicación, determinado según el resultado de una función personalizada que usted defina. La función debe devolver la cadena id de un usuario específico o puede especificar un usuario del sistema devolviendo { "runAsSystem": true }.

5

De forma predeterminada, Atlas incluye los argumentos que una función recibió en la entrada de registro para cada ejecución de la función.

Para evitar que Atlas registre los argumentos, deshabilite Log Function Arguments.

6

Puede autorizar solicitudes dinámicamente según el contenido de cada una definiendo una Can Evaluate expresión. Atlas evalúa la expresión cada vez que se llama a la función. Si no especifica una expresión, Atlas autoriza automáticamente todas las solicitudes entrantes autenticadas.

La expresión puede expandir variables de expresión estándar, incluidas las expansiones %%request %%user y.

La función puede evaluar la entrada de expresión JSON en la interfaz de usuario
haga clic para ampliar
7

De forma predeterminada, se puede llamar a una función desde aplicaciones cliente, así como a otras funciones de la misma aplicación. Puede evitar que las aplicaciones cliente vean o llamen a una función estableciendo Private en true.

Aún puedes llamar a una función privada desde una expresión y otras funciones, incluidos webhooks y activadores entrantes.

El interruptor de función privada en la interfaz de usuario
haga clic para ampliar
8

Después de haber creado y configurado la nueva función, puede escribir el código JavaScript que se ejecuta cuando llama a la función.

Puede escribir el código directamente en la interfaz de usuario de Atlas utilizando el editor de funciones.

  1. Desde la página Create Function, haga clic en la pestaña Function Editor.

  2. Agregue código JavaScript a la función. Como mínimo, el código debe asignar una función a exports, como en el siguiente ejemplo:

    exports = function() {
    return "Hello, world!";
    };

    Nota

    Puede utilizar la mayoría de las funciones modernas de JavaScript (ES6+) en Funciones, incluidas async/await, desestructuración y literales de plantilla.

9

Haga clic en Save. Después de guardar la función, podrá empezar a usarla inmediatamente.

1

Utilice su clave API de administración de MongoDB Atlas para iniciar sesión en la CLI de App Services:

appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>"
2

Ejecute el siguiente comando para obtener una copia local de sus archivos de configuración:

appservices pull --remote=<App ID>

De forma predeterminada, el comando extrae los archivos al directorio de trabajo actual. Puede especificar una ruta de directorio con el indicador opcional --local.

3

Las funciones Atlas ejecutan funciones JavaScript ES6+ estándar que se exportan desde archivos individuales.

  1. Crea un archivo .js en el directorio functions o en un subdirectorio.

    El nombre del archivo debe coincidir con el nombre de la función. Use barras diagonales en el nombre del archivo para indicar la ruta de un subdirectorio.

touch functions/<FunctionName>.js

Tip

Puedes definir funciones dentro de carpetas anidadas en el directorio functions. Usa barras diagonales en el nombre de una función para indicar su ruta de directorio. Por ejemplo, una función llamada utils/add se asigna a functions/utils/add.js.

  1. Escriba el código fuente de la función en el archivo creado.

Por ejemplo, la siguiente función hello.js devuelve un saludo para el nombre proporcionado:

functions/hello.js
exports = async function hello(...args) {
// Write your function logic here! You can...
// Import dependencies
const assert = require("assert")
assert(typeof args[0] === "string")
// Use ES6+ syntax
const sayHello = (name = "world") => {
console.log(`Hello, ${name}.`)
}
// Return values back to clients or other functions
return sayHello(args[0])
}

Nota

Puede utilizar la mayoría de las funciones modernas de JavaScript (ES6+) en Funciones, incluidas async/await, desestructuración y literales de plantilla.

4

En el functions directorio de su aplicación local, abra el config.json archivo y agregue un objeto de configuración para su nueva Función a la matriz.

El objeto debe tener la siguiente forma:

{
"name": "<Function Name>",
"private": <Boolean>,
"can_evaluate": { <JSON Expression> },
"disable_arg_logs": <Boolean>,
"run_as_system": <Boolean>,
"run_as_user_id": "<App Services User ID>",
"run_as_user_id_script_source": "<Function Source Code>"
}
  1. Configurar la autenticación del usuario:

    Las funciones en Atlas siempre se ejecutan en el contexto de un usuario específico de la aplicación o como un usuario del sistema que omite las reglas. Para configurar el usuario de ejecución de la función, especifique el tipo de autenticación que Atlas debe usar.

    Nota

    Las funciones para base de datos y disparadores programados siempre se ejecutan en el contexto de un usuario del sistema.

    • Usuario del sistema: para ejecutar la función como usuario del sistema, utilice la siguiente configuración:

      Configuración de usuario del sistema
      {
      "run_as_system": true,
      "run_as_user_id": "",
      "run_as_user_id_script_source": ""
      }
    • Script: Para ejecutar la Función como un usuario que regresa de otra Función, utilice la siguiente configuración:

      Configuración del script
      {
      "run_as_system": false,
      "run_as_user_id": "",
      "run_as_user_id_script_source": "<Function Source Code>"
      }
    • Usuario (obsoleto): para ejecutar una función como un usuario específico, utilice la siguiente configuración:

      Configuración de ID de usuario (obsoleta)
      {
      "run_as_system": false,
      "run_as_user_id": "<App Services User Id>",
      "run_as_user_id_script_source": ""
      }
  2. Configurar los registros de funciones:

    Para incluir los argumentos que la función recibió en la entrada de registro para cada ejecución de la función, establezca disable_arg_logs en false.

  3. Especifique una expresión de autorización:

    Puede autorizar solicitudes dinámicamente según el contenido de cada una definiendo una Can Evaluate expresión. Atlas evalúa la expresión cada vez que se llama a la función. Si no especifica una expresión, Atlas autoriza automáticamente todas las solicitudes entrantes autenticadas.

    La expresión puede expandir variables de expresión estándar, incluidas las expansiones %%request %%user y.

    Por ejemplo, la siguiente expresión solo autoriza solicitudes entrantes si la dirección IP del remitente no está incluida en la lista de direcciones especificada:

    Ejemplo de expresión de autorización
    {
    "%%request.remoteIPAddress": {
    "$nin": [
    "248.88.57.58",
    "19.241.23.116",
    "147.64.232.1"
    ]
    }
    }
  4. Configurar el nivel de privacidad:

    Para evitar que las aplicaciones cliente vean o llamen a la función, configure private en true.

5

Sube la configuración y el código fuente de la función para implementarla en tu aplicación. Puedes empezar a usarla inmediatamente.

Ejecute el siguiente comando para implementar sus cambios:

appservices push

Puede llamar a una función desde otra función o utilizando la CLI de App Services.

Los ejemplos de esta sección demuestran cómo llamar a una función simple llamada sum que toma dos argumentos, los suma y devuelve el resultado:

funciones/suma.js
// sum: adds two numbers
exports = function sum(a, b) {
return a + b;
};

Puedes llamar a una función desde otra mediante la interfaz context.functions, disponible como variable global en cualquier función. La función llamada se ejecuta en el mismo contexto que la función que la llamó.

// difference: subtracts b from a using the sum function
exports = function difference(a, b) {
return context.functions.execute("sum", a, -1 * b);
};

Se puede llamar una función desde la App Services CLI con el comando function ejecutar. El comando devuelve el resultado de la función en EJSON junto con cualquier mensaje de registro o de error.

appservices function run \
--name=sum \
--args=1 --args=2

De forma predeterminada, las funciones se ejecutan en el contexto del sistema. Para llamar a una función en el contexto de un usuario específico, incluya su ID de usuario en el --user argumento.

appservices function run \
--name=sum \
--args=1 --args=2 \
--user=61a50d82532cbd0de95c7c89
  • Las funciones están limitadas a 300 segundos de tiempo de ejecución por solicitud, después de lo cual la función expirará y fallará.

  • Las funciones pueden utilizar hasta 350MB de memoria en cualquier momento.

  • Las funciones están limitadas a 1000 operaciones asincrónicas.

  • Las funciones6son compatibles con las características más comunes de ES + y los módulos integrados de Node.js. Sin embargo, algunas características poco comunes o inadecuadas para cargas de trabajo sin servidor no son compatibles. Para más información, consulte Compatibilidad con JavaScript.

  • Una función puede abrir un máximo de 25 sockets utilizando el módulo de red integrado.

  • Las solicitudes entrantes tienen un límite de tamaño máximo de 18 MB. Este límite se aplica al tamaño total de todos los argumentos pasados ​​a la función.

Volver

Enviar eventos de activadores a AWS EventBridge

En esta página