- 1

Cómo crear nodos personalizados y escalar infraestructura de n8n
00:58 - 2

Requisitos técnicos para curso avanzado de n8n e infraestructura
00:40 - 3

Comandos esenciales del CLI de n8n para automatización
10:20 - 4

API REST de n8n para controlar workflows desde sistemas externos
06:46 - 5

Creación de custom nodes en n8n con TypeScript para validar emails
13:28 - 6

Configuración de credenciales con API key para custom nodes en n8n
12:03 - 7

Creación de nodos programáticos con execute en n8n
15:16 - 8

Publicación de custom nodes de n8n en npmjs para compartir
09:35 quiz de Gestión avanzada de n8n
Creación de nodos programáticos con execute en n8n
Clase 7 de 13 • Curso de n8n Self-Hosted para Empresas
Contenido del curso
- 9

Tipos de arquitectura de n8n y cuándo usar cada una
02:45 - 10

Instalación de n8n con PostgreSQL usando Docker Compose
07:29 - 11

Instalación de n8n en queue mode con Redis y PostgreSQL
13:39 - 12

Instalación de n8n en Kubernetes con PostgreSQL y Redis
21:25 - 13

Configuración completa de n8n Enterprise para organizaciones
12:33
Crear nodos personalizados en n8n puede ser rápido y claro si eliges bien el enfoque. Aquí verás cómo pasar del estilo declarativo al programático con JavaScript y la función execute, gestionar credenciales, construir la petición HTTP y preparar un output consistente. Ideal para quienes quieren control total sobre la lógica y el formato de datos.
¿Qué diferencia hay entre el estilo declarativo y el programático en n8n?
El enfoque declarativo es como completar un formulario: defines entradas, salidas y comportamiento sin código. Es perfecto para conectar con una API o transformaciones simples. En cambio, el enfoque programático te da control total: escribes JavaScript, manejas condicionales, errores y formatos particulares. En pocas palabras: si buscas rapidez y estructura, usa declarativo; si necesitas flexibilidad y lógica avanzada, toca picar código con execute.
- Declarativo: ideal para conexiones directas y transformación simple de datos.
- Programático: control total con execute, bucles, manejo de errores y formatos complejos.
- Consejo clave: elimina de la parte declarativa lo que ya resuelves en execute.
¿Cómo se implementa un nodo programático con execute y credenciales?
Se parte de un nodo existente y se migra su lógica a la función execute. La guía oficial menciona build your node y el tutorial build a programmatic style node, donde se copian cabeceras necesarias y se prepara el esqueleto.
¿Cómo preparar la cabecera y dependencias del nodo?
- Copia la cabecera sugerida por la documentación y sustituye la primera línea del archivo. Incluye lo necesario para addExecuteFunctions.
- Quita imports o utilidades que ya están en el core y no se usan.
- Elimina opciones como routing y qs de la parte declarativa: ahora eso vive en execute.
- Añade la librería requerida para nodos programáticos: node connection type. Tras incluirla, desaparecen errores en rojo.
¿Cómo estructurar la función execute para procesar items?
Dentro de execute, obtén los items del nodo anterior, recorre cada elemento, lee parámetros, usa credenciales y acumula el resultado en un array para devolver un output consistente.
async execute() {
const items = this.getInputData();
const returnData: Array<{ json: Record<string, any> }> = [];
for (let i = 0; i < items.length; i++) {
const email = this.getNodeParameter('email', i) as string;
const credentials = await this.getCredentials('ApiKeyCamel');
const apiKey = credentials?.API_key;
const response = await this.helpers.httprequest({
method: 'GET',
url: 'https://TU_ENDPOINT_AQUI',
qs: { email, ApiKey: apiKey },
headers: { accept: 'application/json' },
JSON: true,
});
const results = Array.isArray(response) ? response : [response];
for (const result of results) {
returnData.push({
json: {
email: result.email,
// ejemplo de campo booleano u otros datos del servicio
// sePuedeEntregar: result.state === 'deliverable',
score: result.score,
},
});
}
}
return this.prepareOutputData(returnData);
}
Claves prácticas: - Usa this.getInputData para leer el input del nodo anterior. - Usa this.getNodeParameter para extraer parámetros como email. - Usa this.getCredentials y accede a API_key con seguridad opcional. - Asegura un output uniforme: si la respuesta no es array, encapsúlala. - Evita retornar dentro del bucle: el return va al final de execute.
¿Cómo construir la petición HTTP y manejar la respuesta JSON?
La llamada HTTP replica lo que harías con routing, pero ahora en código. Define método, url, query parameters, headers y marca JSON: true para que se gestione el content type automáticamente.
const response = await this.helpers.httprequest({
method: 'GET',
url: 'https://TU_ENDPOINT_AQUI',
qs: {
email,
ApiKey: apiKey,
},
headers: {
accept: 'application/json',
},
JSON: true,
});
const results = Array.isArray(response) ? response : [response];
for (const result of results) {
returnData.push({
json: {
email: result.email,
// sePuedeEntregar: ...
score: result.score,
},
});
}
Errores típicos a evitar: - Nombres que no coinciden: credencial usada en el nodo y declarada, p. ej., ApiKeyCamel y API_key. - Dejar rastro declarativo que duplique la call a la API: borra routing y cualquier referencia a la API en la descripción. - Falta de la librería node connection type en nodos programáticos.
¿Cómo probar el nodo en n8n y validar el output?
Tras ajustar el código, compila y enlaza la librería para probar en el editor.
- Ejecuta el build: pmpm run y build.
- Enlaza tu paquete: pmpm link y conecta la librería.
- Lanza n8n en la línea de comandos y abre localhost:5678.
- Inicia sesión y añade un manual trigger y el nodo verificar email.
- Configura la API key desde tu plataforma y pégala en el workflow.
- Prueba con un email real como promptandplay@gmail.com y verifica que el output muestre: email, si se puede entregar y score.
- Cambia el código para quitar o añadir atributos, vuelve a hacer build, reinicia el servidor y comprueba que el output refleja el cambio.
¿Ya lo tienes funcionando? Comparte qué campos añadiste y pega tu captura en los comentarios.