Ejecución de fragmentos de código en flujos de trabajo con operaciones de código en línea en Azure Logic Apps

Se aplica a: Azure Logic Apps (consumo + estándar)

Para crear y ejecutar un fragmento de código en el flujo de trabajo de la aplicación lógica sin mucha configuración, puede usar el conector integrado de código en línea. Este conector tiene una acción que devuelve el resultado del fragmento de código para poder usar esa salida en las acciones posteriores del flujo de trabajo.

Actualmente, el conector solo tiene una sola acción, que funciona mejor para un fragmento de código con los siguientes atributos, pero hay más acciones en desarrollo. El conector de código en línea también tiene límites diferentes, en función de si el flujo de trabajo de la aplicación lógica es de Consumo o Estándar.

Acción 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 su lugar.

En este artículo, 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

Agregar la acción Ejecutar código de JavaScript

  1. En Azure Portal, abra el flujo de trabajo de la aplicación lógica de consumo en el diseñador.

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

    Captura de pantalla que muestra la acción Ejecutar código JavaScript con el código de ejemplo predeterminado.

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

    Captura de pantalla que muestra el flujo de trabajo de consumo, la acción Ejecutar código JavaScript y la lista autocompletar de palabras clave.

    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.

    Captura de pantalla que muestra el flujo de trabajo de consumo, la acción Ejecutar código JavaScript y el código de ejemplo que crea variables.

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

    Captura de pantalla que muestra el flujo de trabajo de consumo, la acción Ejecutar código JavaScript, la lista de contenido dinámico y la propiedad

    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 objeto workflowContext incluye propiedades que proporcionan al código acceso a las salidas del desencadenador y las acciones anteriores del flujo de trabajo, como la propiedad body del desencadenador, que difiere de la propiedad Body del mensaje de correo electrónico. Para obtener más información sobre el objeto workflowContext, 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.

  5. 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 propiedad body a Body en su lugar. Agregue el punto y coma de cierre (;) al final para finalizar la instrucción de código.

    Captura de pantalla que muestra el flujo de trabajo de la aplicación lógica de consumo, la acción Ejecutar código JavaScript y la propiedad

    La acción Ejecutar código JavaScript no requiere sintácticamente una instrucción return. Sin embargo, al incluir la instrucción return, 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.

    Captura de pantalla que muestra el flujo de trabajo de la aplicación lógica de consumo.

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

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

    Captura de pantalla que muestra el nombre de la acción en JSON.

  2. Para volver a la vista del diseñador, en la barra de herramientas de la vista de código, seleccione Diseñador.

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

  1. En la acción Ejecutar código JavaScript, abra la lista Agregar nuevo parámetro.

  2. 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 .
  3. En este ejemplo, seleccione el parámetro Actions.

    Captura de pantalla que muestra la acción Ejecutar código JavaScript con el parámetro Actions seleccionado.

  4. En el cuadro Elemento de acciones - 1, escriba el nombre JSON de la acción.

    Captura de pantalla que muestra el cuadro

  5. Para agregar otro nombre de acción, seleccione Agregar elemento nuevo.

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

Pasos siguientes