Skip to main content
Un node executor envía datos a un servicio externo y recibe datos de vuelta. El servicio nombra sus propios campos y tu workflow nombra los suyos. Los mapeos son la forma de mover valores entre ambos: una lista de entradas origen-a-destino en el node, que se aplican a la solicitud antes de la llamada y a la respuesta después de ella. Los necesitas cuando la forma que lleva tu workflow no es la que acepta el servicio: un documento que debe viajar sin puntuación, un importe que pertenece a un objeto anidado, un score que un node posterior lee con un nombre corto.

Antes de empezar


  • Una configuración de provider para el servicio y un node executor que la referencie. Consulta Referenciar la configuración de provider desde un node de workflow.
  • Los nombres de los campos que espera el servicio. Cuando el documento OpenAPI del servicio está en el registro, Derivar el esquema de una operación devuelve inputSchema — el cuerpo de la solicitud de la operación — y outputSchema — su respuesta correcta. Ambos te dan los nombres de campo que escribes como target y como source de tus mapeos.
  • Un workflow en estado draft. Un workflow activo queda bloqueado, así que usa Mover el workflow a draft antes de editar un node y actívalo de nuevo después.
No envíes executorId en un node que llama a una operación de un documento OpenAPI subido. Ese node nombra la operación con operation_path y operation_method. Flowker rellena el executorId por ti, a partir de la configuración de provider a la que apunta el node, antes de validar el workflow. Lo hace cuando creas el workflow y cuando lo actualizas. Conectar tu propia API recorre todo ese camino. Los nodes de esta página nombran http, el conector HTTP genérico, que sí necesita un executorId explícito.

Paso 1: Conoce lo que puede leer un mapeo


Todo mapeo lee del contexto del workflow, un único objeto JSON que crece a medida que avanza la ejecución: Direcciona un valor por su ruta desde una de esas claves de primer nivel:
El source de un mapeo es una ruta simple. No lo envuelvas en ${...}: las llaves pertenecen a los campos de plantilla del node (body, headers, query, path), y dentro de un mapeo una cadena ${...} se lee como un nombre de ruta literal que no selecciona nada.

Paso 2: Declara el mapeo de entrada


Los mapeos de entrada viven en un array inputMapping dentro del objeto data del node executor. Cada entrada mueve un valor al cuerpo de la solicitud saliente. El resultado del mapeo es el cuerpo de la solicitud. Escribe cada target exactamente como el servicio espera recibirlo: no hay objeto envolvente ni prefijo que agregar.
Con un payload de trigger de {"transactionId":"txn-98765","amount":1500.00,"customer":{"document":"12345678900"}}, el servicio recibe:

Cuando un source no selecciona nada

Una ruta de origen ausente del contexto no es un error. El target se escribe igualmente, con el valor null, y la solicitud sale. Usa required: true cuando el node no deba llamar al servicio sin un valor. Flowker revisa entonces cada ruta de origen de ese node antes de armar la solicitud y falla el paso cuando alguna está ausente: la ejecución se detiene con FLK-0504 y el paso informa input transformation failed.
required aplica al node, no solo a la entrada que lo lleva. Si alguna entrada del inputMapping de un node pone required: true, cada ruta de origen de ese array debe resolverse. Para mantener algunos campos opcionales, deja required fuera en todo el node.
Dale a cada target una sola entrada. Cuando dos entradas escriben el mismo target, gana la última.

Paso 3: Decide qué arma el cuerpo de la solicitud


Un node tiene tres formas de producir un cuerpo de solicitud. Flowker las revisa en un orden fijo y se detiene en la primera que esté presente:
1

data.body

Una plantilla de cuerpo explícita gana por completo. Flowker resuelve sus referencias ${...} contra el contexto del workflow y envía el resultado. Mientras data.body está presente, inputMapping, transforms y config no aportan nada al cuerpo.Cada referencia ${...} aquí debe resolverse. Una que no lo hace falla el node con FLK-0143, antes de hacer ninguna llamada — lo contrario de un source de mapeo, que se resuelve como null. Usa data.body cuando un valor ausente deba detener el workflow, y un mapeo cuando la solicitud deba salir de todos modos.
2

inputMapping o transforms

En caso contrario, Flowker arma una capa a partir de inputMapping. Cuando inputMapping está vacío, la arma a partir de transforms. Los dos son mutuamente excluyentes: un node con al menos una entrada en inputMapping nunca ejecuta sus transforms sobre la entrada.
3

Literales de config

Los valores literales de data.config siembran el cuerpo. Con una capa presente, los literales son la base y la capa gana en cualquier clave que ambos definan, así un mismo node puede combinar valores fijos con valores mapeados. Sin capa, los literales son el cuerpo por sí solos.
El transporte nunca forma parte del cuerpo de la solicitud. Antes de que config pueda sembrar el cuerpo, Flowker elimina de ahí estos nombres: method, path, url, endpointName, query, headers, auth, retry, timeout, timeout_seconds, request_format, success_status_codes, allowedHosts y allowedPrivateHosts. Por eso un node que guarda transporte en config por error no envía nada de eso al destino, y un bloque auth colocado ahí nunca puede viajar como contenido de la solicitud. El node lee su propio transporte en el primer nivel de su objeto data: path, endpointName, method, headers, query, auth, timeout_seconds, retry, success_status_codes y request_format. Las listas de hosts permitidos de salida no están entre ellos: allowedHosts y allowedPrivateHosts se definen en la configuración de provider, y cada una aplica a todos los nodes que llaman a través de ella.
Los literales y los valores mapeados se combinan, y el anidamiento se combina con el anidamiento:

Paso 4: Ajusta un valor en tránsito


Cuando el servicio necesita un valor en otra forma, agrega una transformation a la entrada del mapeo. Se aplica al valor después de que llega al target. Estos cinco son todo el conjunto. Un type fuera de él se rechaza cuando guardas el workflow, con FLK-0140. Dos reglas para escribirlas:
  • Actúan sobre texto. Un valor que no es texto llega al target sin cambios.
  • prefix y suffix necesitan al menos un carácter cada uno, y un solo espacio cuenta. characters necesita al menos un carácter que no sea un espacio, un tabulador ni un salto de línea. Un valor que no cumple esto falla el paso en tiempo de ejecución con FLK-0504.
A partir de {"customer":{"document":"123.456.789-00","name":"ada lovelace"},"transactionId":"txn-98765"}, el node envía:

Transformaciones sobre todo el documento

Para el trabajo que el mapeo entrada por entrada no expresa — combinar dos campos, elegir el primer valor presente, rellenar un valor por defecto — declara un array transforms. Cada operación lee todo el contexto del workflow y escribe toda la capa. Flowker acepta shift (mover o renombrar), concat (unir valores), coalesce (primer valor presente), default (rellenar una clave ausente), extract (subir un subárbol a la raíz), delete (eliminar una clave), timestamp, uuid y pass. Los cinco tipos de transformación de arriba también están disponibles aquí; como operaciones, reciben la ruta de destino en la spec como path.
El node envía:
Una operación puede poner require: true para exigir que exista cada ruta que nombra su spec, igual que required funciona en una entrada de mapeo.
transforms se ejecuta solo cuando el node no tiene inputMapping. Usa uno u otro en un mismo node, nunca ambos.

Paso 5: Lee la respuesta de vuelta


Los mapeos de salida extraen campos de la respuesta y los guardan en el contexto del workflow bajo el ID del node, para que los nodes posteriores lean nombres cortos y estables. Decláralos en un array outputMapping dentro del data del node, con los mismos cuatro campos de entrada que un mapeo de entrada. Un source de salida es una ruta dentro del envoltorio de respuesta, no dentro del cuerpo de la respuesta: Por eso los campos de la respuesta están bajo body:
En un node cuyo ID es score-transaction, eso guarda:
Los nodes posteriores leen entonces ${score-transaction.score} y ${score-transaction.httpStatus}. Un node que no declara outputMapping guarda todo el envoltorio bajo su ID, y los nodes posteriores leen la ruta del envoltorio directamente: ${score-transaction.body.score}. Agrega un mapeo de salida cuando quieras el nombre corto; omítelo cuando la ruta del envoltorio sea suficientemente clara. Un source de salida que no selecciona nada se comporta como uno de entrada: el target se guarda como null, salvo que una entrada de ese node ponga required: true.

Paso 6: Revisa el mapeo antes de llamar al servicio


Previsualizar la solicitud de un executor arma la solicitud que enviaría un node y te la devuelve. Ejecuta el mismo armado de mapeos, transformaciones y autenticación que ejecuta una ejecución real, y nunca abre una conexión con el servicio, así que puedes iterar sobre un mapeo sin que salga una sola llamada de tu despliegue. Ninguna credencial aparece en lo que devuelve, ni siquiera en el curl. Envía el node, la configuración de provider a la que apunta y un payload de muestra. La configuración de provider va en la propia solicitud, así que la previsualización no depende de nada más que de lo que envías:
Tu sampleInput se convierte en el payload del trigger, así que los source del mapeo lo leen como workflow.*, exactamente como lo harán en tiempo de ejecución. La respuesta es la solicitud armada:
Cada transformación se resolvió: el documento perdió la puntuación, el nombre está en mayúsculas y la referencia lleva su prefijo — y ninguna llamada llegó al servicio. Lee la respuesta en este orden:
1

Revisa la URL

Es la URL base de la configuración de provider más el path del node. Una ruta que no esperabas es un campo del node por corregir, no un mapeo.
2

Revisa el cuerpo contra los nombres de campo que espera el servicio

Cada target debe aparecer donde el servicio lo quiere. Un campo con null es una ruta source que no selecciona nada.
3

Revisa `unresolved`

Lista las referencias ${...} de los campos de plantilla del node que tu payload de muestra no resolvió. Quedan literales en la solicitud armada. Un array vacío significa que cada referencia encontró un valor.
Para revisar además los campos fijos de un node contra el esquema del executor del catálogo, llama a Validar la configuración de un node con la configuración del node en config y, en mappedTargets, las rutas de target que aporta tu inputMapping. Flowker las cuenta como satisfechas, así que un node que mapea un campo requerido desde el trigger pasa la revisión.

Qué puede salir mal


Consulta la lista de errores de Flowker para ver todos los códigos.

Qué sigue


Guía de integración

Crea la configuración de provider por la que llama un node y define su autenticación.

Configurar un trigger de webhook

Elige el contrato de payload que llena el espacio de nombres workflow que leen tus mapeos.