Docs Menu
Docs Home
/ /
Servicios de aplicaciones Atlas

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, admiten módulos comunes integrados de Node.js y permiten importar y usar paquetes externos desde el registro de npm.

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

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.

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 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.

Además de las funciones que invoca directamente, también escribe funciones para varios servicios como puntos finales HTTPS, activadores y solucionadores personalizados de GraphQL (los puntos finales GraphQL y HTTPS están obsoletos. Para obtener más información, consulte Obsolescencia de funciones).

Estos servicios 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.

Tip

El código de una función es esencialmente 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 para que sirva como punto de entrada para las llamadas entrantes. Al llamar a una función por su nombre, en realidad se llama a la función JavaScript asignada a ella. 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\"}"

Una función puede ejecutarse en dos contextos dependiendo de cómo se configure y se llame:

  • Una función de usuario se ejecuta en el contexto de un usuario específico de la aplicación. Normalmente, este es el usuario conectado que la llamó. Las funciones de usuario están sujetas a reglas y validación de esquemas.

  • Una función del sistema se ejecuta como el usuario del sistema en lugar de un usuario específico de la aplicación. Las funciones del sistema tienen acceso completo a las API CRUD y de agregación de MongoDB y omiten todas las reglas y la validación del esquema.

Nota

Referencias dinámicas de context.user

Las referencias a context.user siempre se resuelven al usuario autenticado que llamó a una función, si la hubo, incluso si la función se ejecuta como una función del sistema. Para determinar si una función se ejecuta como una función del sistema, llame context.runningAsSystem() a.

Si una función se ejecuta sin ser llamada por un usuario autenticado, como en un disparador o webhook, las referencias dinámicas se resuelven en el usuario del sistema que no tiene id u otros datos asociados.

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

1

Para definir una nueva función del lado del servidor desde la interfaz de usuario de App Services:

  1. Haga clic Functions en el menú de navegación de la izquierda.

  2. Haga clic en New Function en la parte superior derecha de la página Functions.

2

Introduzca un nombre único e identificativo para la función en el campo Name. Este nombre debe ser distinto al de 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.

3

Las funciones de App Services siempre se ejecutan en el contexto de un usuario de aplicación específico 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 App Services debe usar.

Tipo de autenticación
Descripción

Autenticación de aplicaciones

Este tipo de autenticación configura una función para que se ejecute 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, 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

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

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 de un usuario específico id o puede especificar un usuario del sistema { "runAsSystem": true } devolviendo.

La entrada de configuración de autenticación en la interfaz de usuario
haga clic para ampliar
4

De forma predeterminada, App Services incluye los argumentos que una función recibió en la entrada de registro para cada ejecución. Si desea evitar que App Services registre los argumentos,Log Function Arguments deshabilite.

5

Puede autorizar solicitudes dinámicamente según el contenido de cada solicitud al definir una Can Evaluate expresión. App Services evalúa la expresión cada vez que se llama a la función. Si no especificas una expresión, aplicación Services autorizará 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 entrada de expresión JSON de la función puede evaluarse en la interfaz de usuario
haga clic para ampliar
6

De forma predeterminada, se puede llamar a una función desde aplicaciones cliente, así como desde otras funciones de la misma aplicación. Puede impedir 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.

La función privada alterna en la interfaz de usuario
haga clic para ampliar
7

Una vez creada y configurada la nueva función, es hora de escribir el código JavaScript que se ejecuta al llamarla. Puedes escribir el código directamente en la interfaz de usuario de App Services mediante el editor de funciones.

Nota

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

Desde la página Settings de la función:

  1. Haz 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!";
    };
8

Una vez que haya escrito el código de función, haga clic en Save desde la pestaña Function Editor o Settings.

Después de guardar la función, puede comenzar a utilizarla inmediatamente.

1
appservices pull --remote=<App ID>
2

Las funciones Atlas ejecutan funciones JavaScript estándar de ES6+ que se exportan desde archivos individuales. Cree un archivo .js con el mismo nombre que la función en el directorio functions o en uno de sus subdirectorios.

touch functions/myFunction.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.

Una vez que haya creado el archivo .js de la función, escriba el código fuente de la función, por ejemplo:

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

Puedes usar la mayoría de las funciones modernas de6JavaScript (ES +) en funciones, como async/await, desestructuración y literales de plantilla. Para ver si App Services admite una función específica, consulta Compatibilidad con JavaScript.

3

En el functions directorio de su aplicación, abra el config.json archivo y agregue un objeto de configuración para su nueva función a la matriz. El objeto debe tener el siguiente formato:

{
"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

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

  • Sistema

    Para ejecutar una función como usuario del sistema, utilice la siguiente configuración:

    {
    "run_as_system": true,
    "run_as_user_id": "",
    "run_as_user_id_script_source": ""
    }
  • Usuario

    Para ejecutar una función como un usuario específico, utilice la siguiente configuración:

    {
    "run_as_system": false,
    "run_as_user_id": "<App Services User Id>",
    "run_as_user_id_script_source": ""
    }
  • Guión

    La tercera forma de ejecutar una función es especificar otra función que devuelva un ID de usuario. La función se ejecutará como este usuario. Para ello, utilice la siguiente configuración:

    {
    "run_as_system": false,
    "run_as_user_id": "",
    "run_as_user_id_script_source": "<Function Source Code>"
    }
2

Para incluir cualquier valor que la función reciba como argumento en su entrada de registro,disable_arg_logs establezca false en.

3

Puede autorizar solicitudes dinámicamente según el contenido de cada solicitud al definir una Can Evaluate expresión. App Services evalúa la expresión cada vez que se llama a la función. Si no especificas una expresión, aplicación Services autorizará automáticamente todas las solicitudes entrantes autenticadas.

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

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.

{
"%%request.remoteIPAddress": {
"$nin": [
"248.88.57.58",
"19.241.23.116",
"147.64.232.1"
]
}
}
4

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

Puede llamar a una función privada desde una expresión de regla u otra función, incluidos los puntos finales y activadores HTTPS.

4

Sube la configuración y el código fuente de la función para implementarla en tu aplicación. Una vez que la hayas subido, puedes empezar a usarla inmediatamente.

appservices push

Puede llamar a una función desde otras funciones, desde una aplicación cliente conectada o con 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:

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

Puedes llamar a una función desde otra función a través de la interfaz context.functions, la cual está disponible como variable global en cualquier función. Esto incluye endpoints HTTPS, activadores y resolutores personalizados GraphQL (desaprobado, más información). La función llamada se ejecuta en el mismo contexto que la función que la invocó.

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

Puedes llamar a una función mediante la CLI de App Services con el comando function run. Este comando devuelve el resultado de la función como EJSON, así como cualquier mensaje de registro o 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

Puedes llamar a una función desde una expresión de regla usando el operador. Este operador evalúa el valor de retorno de la función. Si la función genera un error, la %function expresión false evalúa.

{
"numGamesPlayed": {
"%function": {
"name": "sum",
"arguments": [
"%%root.numWins",
"%%root.numLosses"
]
}
}
}

Importante

Asegúrese de desinfectar los datos del cliente para protegerlos contra la inyección de código al usar funciones.

Puede llamar a una función desde aplicaciones cliente conectadas con un SDK de Realm o mediante un protocolo de red. Para ver ejemplos de código que muestran cómo llamar a una función desde una aplicación cliente, consulte la documentación de los SDK de Realm:

  • 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 usando la red módulo incorporado.

  • 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, así como a los encabezados o la carga útil de la solicitud si la función se llama a través de un punto final HTTPS.

Volver

Desuso del servicio

En esta página