Incorporación y ejecución de código JavaScript insertada con flujos de trabajo para Azure Logic Apps
Se aplica a: Azure Logic Apps (consumo + estándar)
Para realizar tareas de integración personalizadas insertadas con el flujo de trabajo en Azure Logic Apps, puede agregar y ejecutar directamente fragmentos de código JavaScript sencillos desde el flujo de trabajo en Azure Portal. Para esta tarea, use la acción Código insertado denominada Ejecutar código JavaScript. Esta acción devuelve el resultado del fragmento de código para poder usar esa salida en las acciones posteriores del flujo de trabajo. Esta acción también tiene límites diferentes, en función de si tiene una flujo de trabajo Estándar o de Consumo y funciona mejor para los fragmentos de código con los siguientes atributos:
Action | Lenguaje | Versión de lenguaje | Duración de la ejecución | Tamaño de los datos | Otras notas |
---|---|---|---|---|---|
Ejecutar código de JavaScript | JavaScript | Estándar: Node.js 16.x.x Consumo: Node.js 8.11.1 Para más información, consulte Objetos integrados estándar. |
Finaliza en 5 segundos o menos. | Controla datos de hasta 50 MB. | - No requiere trabajar con acciones de variables, ya que la acción no las admite. - No admite la función require() para ejecutar JavaScript. |
Para ejecutar código que no se ajuste a estos atributos, puede crear y llamar a una función mediante Azure Functions.
En esta guía se muestra cómo funciona la acción en un flujo de trabajo de ejemplo que comienza con un desencadenador de Outlook de Office 365. El flujo de trabajo se ejecuta cuando llega un nuevo correo electrónico a la cuenta de correo electrónico de Outlook asociada. El fragmento de código de ejemplo extrae las direcciones de correo electrónico que existen en el cuerpo del correo electrónico y devuelve esas direcciones como una salida que puede usar en una acción posterior.
En el diagrama siguiente, se muestran los aspectos destacados del flujo de trabajo de ejemplo:
Requisitos previos
Una cuenta y una suscripción de Azure. Si aún no tiene una, regístrese para obtener una cuenta de Azure gratuita.
El flujo de trabajo de la aplicación lógica donde quiere agregar el fragmento de código. El flujo de trabajo ya debe comenzar con un desencadenador.
En el ejemplo de este artículo, se usa el desencadenador de Outlook de Office 365 llamado Cuando llega un nuevo correo electrónico.
Si no tiene un flujo de trabajo, revise esta documentación:
En función de si tiene un flujo de trabajo de aplicación lógica de Consumo o Estándar, revise los siguientes requisitos:
Flujo de trabajo de consumo
Vínculo a una cuenta de integración, vacía o no, desde el recurso de la aplicación lógica.
Importante
Asegúrese de usar una cuenta de integración adecuada para su caso de uso o escenario.
Por ejemplo, las cuentas de integración de nivel gratuito están diseñadas solo para escenarios y cargas de trabajo exploratorias, no para escenarios de producción, están limitadas en el uso y el rendimiento, y no se admiten en un contrato de nivel de servicio (SLA).
Otros niveles de cuentas de integración acarrean costos, pero incluyen compatibilidad con el Acuerdo de Nivel de Servicio, ofrecen más rendimiento y tienen límites más altos. Obtenga más información sobre los niveles de la cuenta de integración, los límites y los precios.
Flujo de trabajo Estándar
No se requiere ninguna cuenta de integración.
Agregar la acción Ejecutar código de JavaScript
En Azure Portal, abra el flujo de trabajo de la aplicación lógica de consumo en el diseñador.
En el diseñador, siga estos pasos generales para agregar la acción Código insertado denominada Ejecutar código JavaScript al flujo de trabajo.
Este ejemplo agrega la acción en el desencadenador de Office 365 Outlook. De forma predeterminada, la acción contiene código de ejemplo, incluida una instrucción
return
.En el cuadro Código, elimine el código de ejemplo y escriba su código. Escriba el código que colocaría dentro de un método, pero sin la firma del método.
Sugerencia
Cuando el cursor está en el cuadro Código, aparece la lista de contenido dinámico. Aunque usará esta lista más adelante, puede omitir el paso y dejar la lista abierta por ahora. No seleccione Ocultar.
Si empieza a escribir una palabra clave reconocida, aparece la lista de Autocompletar para que pueda seleccionar entre las palabras clave disponibles, por ejemplo:
El siguiente fragmento de código de ejemplo crea primero una variable llamada myResult que almacena una expresión regular, la cual especifica un patrón de coincidencia con el texto de entrada. A continuación, el código crea una variable llamada email que almacena el contenido del cuerpo del mensaje de correo electrónico de las salidas del desencadenador.
Con el cursor todavía en el cuadro Código, en la lista de contenido dinámico abierta, busque la sección Cuando llega un nuevo correo electrónico y seleccione la propiedad Body, que hace referencia al cuerpo del mensaje de correo electrónico.
La lista de contenido dinámico muestra las salidas del desencadenador y las acciones anteriores cuando esas salidas coinciden con el formato de entrada del cuadro de edición que tiene el foco actualmente. Esta lista facilita el uso y la referencia a estas salidas desde el flujo de trabajo. En este ejemplo, la lista muestra las salidas del desencadenador de Outlook, incluida la propiedad Body del mensaje de correo electrónico.
Después de seleccionar la propiedad Body, la acción Ejecutar código JavaScript resuelve el token en un objeto JSON
workflowContext
de solo lectura que el fragmento de código puede usar como entrada. El objetoworkflowContext
incluye propiedades que proporcionan al código acceso a las salidas del desencadenador y las acciones anteriores del flujo de trabajo, como la propiedadbody
del desencadenador, que difiere de la propiedad Body del mensaje de correo electrónico. Para obtener más información sobre el objetoworkflowContext
, consulte Referencia a las salidas del desencadenador y la acción mediante el objeto workflowContext más adelante en este artículo.Importante
Si el fragmento de código hace referencia a nombres de acción que incluyen el operador punto (.), esas referencias tienen que rodear estos nombres de acción con corchetes ([]) y comillas (""), por ejemplo:
// Correct
workflowContext.actions["my.action.name"].body
// Incorrect
workflowContext.actions.my.action.name.body
Además, en la acción Ejecutar código JavaScript, tiene que agregar el parámetro Actions y, a continuación, agregar estos nombres de acción a ese parámetro. Para obtener más información, consulte Adición de dependencias como parámetros a una acción Ejecutar código JavaScript más adelante en este artículo.
Para diferenciar la propiedad Body del mensaje de correo electrónico que seleccionó de la propiedad
body
del desencadenador, cambie el nombre de la segunda propiedadbody
aBody
en su lugar. Agregue el punto y coma de cierre (;) al final para finalizar la instrucción de código.La acción Ejecutar código JavaScript no requiere sintácticamente una instrucción
return
. Sin embargo, al incluir la instrucciónreturn
, puede hacer referencia más fácilmente a los resultados de la acción más adelante en el flujo de trabajo mediante el token Result en acciones posteriores.En este ejemplo, el fragmento de código devuelve el resultado mediante una llamada a la función
match()
, que busca coincidencias en el cuerpo del correo electrónico con la expresión regular especificada. A continuación, la acción Crear tabla HTML usa el token Result para hacer referencia a los resultados de la acción Ejecutar código JavaScript y crea un solo resultado.Cuando haya terminado, guarde el flujo de trabajo.
Referencia a las salidas del desencadenador y la acción mediante el objeto workflowContext
Desde el fragmento de código en el diseñador, puede usar la lista de contenido dinámico para seleccionar un token que haga referencia a la salida del desencadenador o cualquier acción anterior. Al seleccionar el token, la acción Ejecutar código JavaScript resuelve ese token en un objeto JSON workflowContext
de solo lectura. Este objeto proporciona al código acceso a las salidas del desencadenador, las acciones anteriores y el flujo de trabajo. El objeto usa la estructura siguiente e incluye las propiedades actions
, trigger
y workflow
, que también son objetos:
{
"workflowContext": {
"actions": {
"<action-name-1>": @actions('<action-name-1>'),
"<action-name-2>": @actions('<action-name-2>')
},
"trigger": {
@trigger()
},
"workflow": {
@workflow()
}
}
}
La tabla siguiente contiene más información sobre estas propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
actions |
Colección de objetos | Objetos de resultado de acciones anteriores que se ejecutan antes de que se ejecute el fragmento de código. Cada objeto tiene un par clave-valor donde la clave es el nombre de la acción y el valor es equivalente al resultado de llamar a la función actions() con la expresión @actions('<action-name>') . El nombre de la acción utiliza el mismo nombre de acción que aparece en la definición del flujo de trabajo subyacente, que reemplaza los espacios (" ") en el nombre de acción por caracteres de subrayado (_). Esta colección de objetos proporciona acceso a los valores de las propiedades de la acción de la ejecución de la instancia de flujo de trabajo actual. |
trigger |
Object | Objeto de resultado del desencadenador, donde el resultado es equivalente a llamar a la función trigger(). Este objeto proporciona acceso a los valores de las propiedades del desencadenador de la ejecución de la instancia de flujo de trabajo actual. |
workflow |
Object | Objeto de flujo de trabajo, que es equivalente a llamar a la función workflow(). Este objeto proporciona acceso a los valores de las propiedades del flujo de trabajo, como el nombre del flujo de trabajo, el identificador de ejecución, etc., de la ejecución de la instancia de flujo de trabajo actual. |
En el ejemplo de este artículo, el objeto JSON workflowContext
podría tener las siguientes propiedades y valores de ejemplo del desencadenador de Outlook:
{
"workflowContext": {
"trigger": {
"name": "When_a_new_email_arrives",
"inputs": {
"host": {
"connection": {
"name": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Web/connections/office365"
}
},
"method": "get",
"path": "/Mail/OnNewEmail",
"queries": {
"includeAttachments": "False"
}
},
"outputs": {
"headers": {
"Pragma": "no-cache",
"Content-Type": "application/json; charset=utf-8",
"Expires": "-1",
"Content-Length": "962095"
},
"body": {
"Id": "AAMkADY0NGZhNjdhLTRmZTQtNGFhOC1iYjFlLTk0MjZlZjczMWRhNgBGAAAAAABmZwxUQtCGTqSPpjjMQeD",
"DateTimeReceived": "2019-03-28T19:42:16+00:00",
"HasAttachment": false,
"Subject": "Hello World",
"BodyPreview": "Hello World",
"Importance": 1,
"ConversationId": "AAQkADY0NGZhNjdhLTRmZTQtNGFhOC1iYjFlLTk0MjZlZjczMWRhNgAQ",
"IsRead": false,
"IsHtml": true,
"Body": "Hello World",
"From": "<sender>@<domain>.com",
"To": "<recipient-2>@<domain>.com;<recipient-2>@<domain>.com",
"Cc": null,
"Bcc": null,
"Attachments": []
}
},
"startTime": "2019-05-03T14:30:45.971564Z",
"endTime": "2019-05-03T14:30:50.1746874Z",
"scheduledTime": "2019-05-03T14:30:45.8778117Z",
"trackingId": "1cd5ffbd-f989-4df5-a96a-6e9ce31d03c5",
"clientTrackingId": "08586447130394969981639729333CU06",
"originHistoryName": "08586447130394969981639729333CU06",
"code": "OK",
"status": "Succeeded"
},
"workflow": {
"id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Logic/workflows/<logic-app-workflow-name>",
"name": "<logic-app-workflow-name>",
"type": "Microsoft.Logic/workflows",
"location": "<Azure-region>",
"run": {
"id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Logic/workflows/<logic-app-workflow-name>/runs/08586453954668694173655267965CU00",
"name": "08586453954668694173655267965CU00",
"type": "Microsoft.Logic/workflows/runs"
}
}
}
}
Adición de dependencias como parámetros a una acción Ejecutar código JavaScript
En algunos escenarios, es posible que deba requerir de forma explícita que la acción Ejecutar código JavaScript incluya las salidas del desencadenador o las acciones a las que el código hace referencia como dependencias. Por ejemplo, debe realizar este paso adicional cuando el código hace referencia a salidas que no están disponibles en tiempo de ejecución en el flujo de trabajo. Durante el tiempo de creación del flujo de trabajo, el motor de Azure Logic Apps analiza el fragmento de código para determinar si el código hace referencia a cualquier salida del desencadenador o la acción. Si existen esas referencias, el motor incluye esas salidas automáticamente. En tiempo de ejecución del flujo de trabajo, si la salida del desencadenador o la acción a la que se hace referencia no se encuentra en el objeto workflowContext
, el motor genera un error. Para resolver este error, debe agregar ese desencadenador o esa acción como una dependencia explícita de la acción Ejecutar código JavaScript. Se produce otro escenario que requiere que realice este paso cuando el objeto workflowContext
hace referencia a un nombre de desencadenador o acción que usa el operador punto (.).
Para agregar un desencadenador o una acción como una dependencia, agregue los parámetros Trigger o Actions según corresponda a la acción Ejecutar código JavaScript. A continuación, agregue los nombres de desencadenador o acción tal y como aparecen en la definición JSON subyacente del flujo de trabajo.
Nota:
No se pueden agregar operaciones de variables, bucles como For each o Until ni índices de iteración como dependencias explícitas.
Si tiene previsto reutilizar el código, asegúrese de usar siempre el cuadro de edición del fragmento de código para hacer referencia a las salidas de desencadenadores y acciones. De este modo, el código incluye las referencias de token resueltas, en lugar de simplemente agregar las salidas del desencadenador o la acción como dependencias explícitas.
Por ejemplo, supongamos que la acción Enviar correo electrónico de aprobación del conector de Outlook de Office 365 precede al fragmento de código en el flujo de trabajo de ejemplo. El siguiente fragmento de código de ejemplo incluye una referencia a la salida SelectedOption de esta acción.
En este ejemplo, solo tiene que agregar el parámetro Actions y, a continuación, agregar el nombre JSON de la acción, Send_approval_email
, al parámetro. De este modo, especifica que la acción Ejecutar código JavaScript incluye explícitamente la salida de la acción Enviar correo electrónico de aprobación.
Búsqueda del nombre JSON del desencadenador o de la acción
Antes de empezar, necesita el nombre JSON del desencadenador o de la acción en la definición de flujo de trabajo subyacente.
Los nombres de la definición de flujo de trabajo usan un carácter de subrayado (_), no un espacio.
Si un nombre de acción usa el operador dot (.), incluya ese operador, por ejemplo:
My.Action.Name
En la barra de herramientas del diseñador de flujos de trabajo, seleccione vista Código. En el objeto
actions
, busque el nombre de la acción.Por ejemplo,
Send_approval_email
es el nombre JSON de la acción Enviar correo electrónico de aprobación.Para volver a la vista del diseñador, en la barra de herramientas de la vista de código, seleccione Diseñador.
Ahora agregue el nombre JSON a la acción Ejecutar código JavaScript.
Adición del nombre del desencadenador o de la acción a la acción Ejecutar código JavaScript
En la acción Ejecutar código JavaScript, abra la lista Agregar nuevo parámetro.
En la lista de parámetros, seleccione los parámetros siguientes según los requisitos del escenario.
Parámetro Descripción Acciones Incluya las salidas de las acciones anteriores como dependencias. Al seleccionar este parámetro, se le preguntará qué acciones desea agregar. Desencadenador Incluya las salidas del desencadenador como dependencias. Al seleccionar este parámetro, se le preguntará si desea incluir los resultados del desencadenador. Por lo tanto, en la lista Desencadenador, seleccione Sí. En este ejemplo, seleccione el parámetro Actions.
En el cuadro Elemento de acciones - 1, escriba el nombre JSON de la acción.
Para agregar otro nombre de acción, seleccione Agregar elemento nuevo.
Cuando haya terminado, guarde el flujo de trabajo.
Referencia de acciones
Para más información sobre la estructura y la sintaxis de la acción Ejecutar código de JavaScript de la definición de flujo de trabajo subyacente mediante el lenguaje de definición de flujo de trabajo, consulte la sección de referencia de esta acción.