En esta ocasión, te enseñamos un flujo de trabajo n8n (n8n workflow, en inglés) simple a través del cual obtendrás datos de una base de datos MySQL, que después podrás transformar, para realizar una solicitud POST a una API REST. Para ejecutar los servicios necesarios para el flujo de trabajo utilizaremos un archivo Docker Compose.
Necesitarás un conocimiento básico de Docker, Docker Compose, MySQL, JSON Y APIs.
¿Qué es n8n?
N8n es una herramienta de automatización de procesos de bajo código que te permite crear procesos personalizados y automatizar tareas que están relacionadas con diversas aplicaciones y servicios.
Puedes hospedarla tú mismo de manera gratuita. Sin embargo, n8n también proporciona soporte empresarial para instalaciones autohospedadas y un servicio cloud, en caso de que prefieras mantener la instalación n8n en tu infraestructura.
Configura n8n con Docker Compose
Docker Compose puede resultar muy útil para ejecutar el servidor n8n y todos los servicios de back-end necesarios, como la base de datos o la API REST, en un único lugar fácil de administrar.
Necesitarás enumerar los servicios necesarios en el archivo docker-compose.yml para poder utilizar Docker Compose con n8n. Este archivo incluye imágenes de cada servicio, variables de entorno y configuraciones necesarias y cómo deberían conectarse estos servicios. Vamos a definir los siguientes servicios:
- Servicio MySQL: se utiliza para registrar y obtener productos de una base de datos.
- Servicio API: proporciona un endpoint «http://api:3000/products/mysql» que devuelve una respuesta JSON {“status”: “success”} cuando creas un nuevo producto.
- Servicio n8n: ejecuta el proceso que integra todos los servicios y lleva a cabo las acciones necesarias.
El archivo docker-compose.yml tendrá este aspecto:
version: '3.8' services: # n8n n8n: image: n8nio/n8n ports: - "5678:5678" environment: - N8N_BASIC_AUTH=true - N8N_BASIC_AUTH_USERNAME=myusername - N8N_BASIC_AUTH_PASSWORD=mypassword # MySQL mysql: image: mysql:latest restart: always environment: - MYSQL_ROOT_PASSWORD=mypassword - MYSQL_DATABASE=mydatabase - MYSQL_USER=myuser - MYSQL_PASSWORD=mypassword ports: - "3306:3306" volumes: - ./scripts/mysql:/docker-entrypoint-initdb.d # API REST api: build: context: ./simple-api-rest dockerfile: Dockerfile ports: - "3000:3000" command: npm run start
Clona el repositorio https://github.com/ChakrayES/docker-compose-n8n-wf-example-1, selecciona la carpeta n8n-application-post y ejecuta:
docker compose build
De esta manera, crearás la imagen para la aplicación API REST. Después, ejecuta:
docker compose pull
para extraer las imágenes de n8n y MySQL con las últimas versiones de las aplicaciones.
Por último, inicia los servicios con:
docker compose up
N8n Workflow
El flujo de trabajo que te mostramos como ejemplo tiene una secuencia de nodos conectados que recopilan información frecuentemente de los productos que se han creado en el último día desde una base de datos MySQL. Los datos se transforman para generar una solicitud JSON y así enviarla a un endpoint específico a través de una solicitud HTTP POST. Un desencadenador de programación que ejecuta el flujo de trabajo una vez al día e inicia el proceso.
Imagen 1. N8N Workflow
Antes de explicar el flujo de trabajo detalladamente, debes importarlo a su instancia n8n.
1.Entra en http://localhost:5678/ y omite la configuración.
2. Haz clic en crear un nuevo flujo de trabajo desde cero.
3. En configuración, selecciona importar desde URL (Import from URL…) e introduce la URL en la configuración JSON del flujo de trabajo que se almacena en Github: https://raw.githubusercontent.com/ChakrayES/docker-compose-n8n-wf-example-1/main/Workflow.json.
Figura 2. Workflow detallado
4. Por último, guarda el flujo de trabajo.
Desencadenador programado
Esta opción de n8n te permite configurar la frecuencia y el tiempo de ejecución del flujo de trabajo. Esta configuración provoca la ejecución del flujo de trabajo todos los días a las 8:00:
Nodo fecha y hora
El nodo fecha y hora (Date & Time node) es una herramienta potente y flexible que permite trabajar con valores de fecha y hora. Facilita la automatización de tareas que requieren cálculos con base en el tiempo.
-Lo usamos para obtener la marca de tiempo de inicio del flujo de trabajo y así convertirla a la zona horaria UTC.
Con {{ }} podemos usar JavaScript en los parámetros de los nodos. Podemos acceder a los valores del elemento anterior con el operador $json. En este caso, tenemos que acceder a la marca de tiempo (timestamp) del elemento de entrada.
En el campo Property Name elegimos el nombre del elemento de salida, en el que se almacenará el resultado de la conversión. Hemos llamado fromDatetime a esa propiedad.
Además, hemos activado la opción Custom Format para especificar el formato de salida en “YYYY-MM-DDTHH:mm:ss.SSSZ”.
En Options, encontramos:
- To Timezone Name or ID, con la zona horaria en UTC. La fecha resultante estará en la zona horaria UTC.
- From Format, con el formato del valor de entrada. La marca de tiempo resultante tendrá el formato “YYYY-MM-DDTHH:mm:ss.SSSZ”.
Imagen 3. Formato de fecha
De nuevo, si haces clic en el nodo y en el botón ejecutar (Execute), se forzará la ejecución. Podrás ver cómo aparece la propiedad fromDatetime en el elemento de salida:
Imagen 4. Formato de fecha II
Nodo MySQL
Este nodo te permitirá ejecutar una consulta MySQL (MySQL query).
Lo hemos configurado para que permita ejecutar una consulta que selecciona todas las filas de la tabla de productos (products) que se han creado en el último día. En la consulta, emplearemos la fecha y hora UTC que se genera en el nodo anterior:
Imagen 5. MySQL
Como puedes ver, el nodo MySQL está en rojo y el programa nos advierte. Eso se produce porque el nodo MySQL necesita una credencial para conectarse a la base de datos.
1.Haz clic en Create New Credential para crear la credencial:
Imagen 6. Credenciales MySQL
Imagen 7. Cuenta MySQL
2. Una vez hayas guardado, vuelve al nodo MySQL y fuerza su ejecución:
Imagen 8. Nodo de ejecución
Configura el nodo
Puedes establecer o modificar los valores de los datos entrantes, como actualizar un valor, combinar cadenas y darles formato a las fechas, entre otros. Utilizaremos este nodo para establecer nuevos valores en la creación de un nuevo producto en nuestro API.
A través de este nodo, generamos la solicitud de la llamada REST API (REST API call).
Activa la casilla «Keep only set» para generar un elemento de salida con los valores que estamos configurando en el nodo. El comportamiento predeterminado copiará las propiedades de entrada a las de salida.
Selecciona también la opción «Dot notation», que modifica cómo se generan las propiedades. Si «Dot notation» está activada, el resultado de establecer una propiedad xxx.yyy con el valor zzz será: { “xxx”: { “yyy”: “zzz” } }. Si no está habilitada, el resultado sería: { “xxx .yyy”: “zzz” }.
Puesto que la solicitud que debemos enviar a la API para crear un producto es así { “item”: { “nameProduct”: “Some Product”, “priceItem”: “10” } } estableceremos dos valores en el nodo:
Imagen 9. Preparar solicitud
Si forzamos la ejecución, podremos ver que el nodo emplea su lógica con cada uno de los elementos de entrada:
Imagen 10. Elementos de entrada
Nodo de solicitud HTTP
Se utiliza para hacer una solicitud HTTP a una URL específica. Este nodo sirve para recuperar datos de API externas y para comunicarse con servicios web.
Utilizamos este nodo para realizar una solicitud POST a nuestra API con la intención de crear los productos obtenidos en la base de datos.
Esta es la configuración del nodo:
Imagen 11. Solicitud HTTP
Podemos ver el método HTTP, la URL y la configuración para enviar el cuerpo JSON. Este código JavaScript sirve para establecer el parámetro JSON {{ JSON.stringify($json[“item”]) }}.
Si fuerzas la ejecución, las llamadas correspondientes a los 10 elementos de entrada finalizarán con éxito:
Imagen 12. Solicitud HTTP II
Activar el flujo de trabajo (workflow)
Hasta ahora, has ejecutado manualmente el flujo de trabajo nodo por nodo.
Hemos configurado el desencadenador de programación para que se ejecute todos los días a medianoche porque queríamos que el flujo de trabajo se ejecutara automáticamente. Sin embargo, todavía no se activará a la hora establecida.
Se debe a que un flujo de trabajo necesita activar los otros flujos para activar el desencadenador. Para ello, solo tienes que hacer clic en la parte superior de la pantalla y el flujo de trabajo se activará automáticamente todos los días a medianoche.
Imagen 13. Mi flujo de trabajo
Conclusión
En resumen, n8n es una buena solución para unificar varias aplicaciones y servicios. Puede conectarse perfectamente a múltiples fuentes, como bases de datos MySQL y API REST, y ejecutar funciones de transformación de datos. Esto demuestra su adaptabilidad y versatilidad. Además, el uso de Docker Compose a la hora de ejecutar todos los servicios necesarios demuestra su compatibilidad con las tecnologías y las metodologías de desarrollo actuales. Puede decirse que las funciones de flujo de trabajo de n8n son potentes e intuitivas y lo convierten en una elección óptima para trabajar con datos y proyectos de integración.
Si necesitas ayuda para hacerlo, ¡no dudes en contactar con nosotros!