Quiero crear nodos personalizados para n8n. Mientras estudiaba cómo crearlos, me encontré con una ejecución “create” de n8n a mi backend. Esta “create” me proporcionó una lista de webhooks para mis nodos disparadores.
¿Necesito almacenar todos los webhooks de mis nodos disparadores en la base de datos?
Mi idea es que el backend necesita una forma de saber qué llamar para informar a n8n que dispare. ¿Y esa “forma” son todos los webhooks proporcionados por n8n y almacenados en la base de datos?
¿Cuál es la mejor práctica para esto?
¿Qué pasa si diferentes flujos de trabajo tienen el mismo nodo? ¿Necesito recorrer mi base de datos para verificar?
¿Cuál es el mensaje de error (si la hay)?
Por favor, comparte tu flujo de trabajo
(Selecciona los nodos en tu lienzo y usa los atajos de teclado CMD+C/CTRL+C y CMD+V/CTRL+V para copiar y pegar el flujo de trabajo.)
Comparte el resultado devuelto por el último nodo
Información sobre tu configuración de n8n
Versión de n8n:
Base de datos (predeterminado: SQLite):
Configuración EXECUTIONS_PROCESS de n8n (predeterminado: own, main):
Ejecutando n8n mediante (Docker, npm, n8n cloud, aplicación de escritorio):
Hola @firdaus_webby Sí, las almacenaría, pero las pensaría como suscripciones, no solo como una lista de webhooks.
Cuando se activa un flujo de trabajo con tu disparador, guarda
algo como:
CREATE TABLE n8n_subscriptions (
id UUID PRIMARY KEY,
event_type TEXT NOT NULL,
workflow_id TEXT NOT NULL,
webhook_url TEXT NOT NULL,
active BOOLEAN DEFAULT true
);
Luego tu backend puede simplemente hacer:
Ocurre un evento → encuentra suscripciones activas → llama a sus URLs de webhook
Si cinco flujos de trabajo utilizan el mismo disparador, simplemente obtienes cinco suscripciones para ese evento. No necesitas escanear todos los flujos de trabajo o nodos cada vez.
También agregaría una restricción única en algo como (workflow_id, event_type) para que activar el mismo flujo de trabajo dos veces no cree accidentalmente suscripciones duplicadas.
Hola @firdaus_webby, sí, tu backend necesita persistir las suscripciones para saber a qué URLs de devolución de llamada notificar.
Si te refieres a webhookMethods.default.create, obtén la devolución de llamada usando this.getNodeWebhookUrl('default') y regístrala con tu backend. Haz que el backend devuelva un ID de suscripción y guárdalo en this.getWorkflowStaticData('node'). Implementa checkExists para verificar ese registro y delete para eliminar esa suscripción específica.
Un ajuste al esquema sugerido: no hagas que (workflow_id, event_type) sea único. Un flujo de trabajo puede contener dos nodos disparadores coincidentes, e instancias diferentes de n8n pueden reutilizar IDs de flujo de trabajo. Haz que el registro sea idempotente usando la cuenta, la URL de devolución de llamada completa y el evento/filtro en su lugar.
Cuando ocurra un evento, consulta las suscripciones para esa cuenta y evento, luego realiza un POST a cada devolución de llamada coincidente. Indexa esos campos de búsqueda; no necesitas escanear flujos de trabajo.
El Typeform Trigger tiene un ejemplo funcional de los tres métodos:
Cuando n8n activa un flujo de trabajo que utiliza tu nodo de activación personalizado, llama al método create y te proporciona la URL única del webhook para ese flujo de trabajo específico. Tu backend necesita conocer esa URL para poder enviarle eventos más tarde.
Buena práctica
1. En el método create → almacena la URL del webhook (además de cualquier ID útil como workflowId, nodeId, ID de usuario, tipo de evento, etc.) en tu base de datos.
2. En el método delete → elimina esa entrada de la base de datos.
3. Cuando algo ocurra en tu sistema que deba activar n8n → consulta la base de datos para encontrar los webhooks relevantes y envía el payload mediante POST a ellos.
Múltiples flujos de trabajo utilizando el mismo nodo
Sin problema. Cada flujo de trabajo activado obtiene su propia URL única de webhook. Solo almacena múltiples filas. Cuando ocurra un evento, consulta por lo que tenga sentido (usuario, ID de recurso, tipo de evento…) y activa todos los webhooks que coincidan. No necesitas iterar a través de todo, solo usa un índice adecuado en las columnas por las que filtras