Contenido

Tutorial de expresiones en n8n: $json, $('nodo'), fechas y funciones útiles

Las expresiones permiten que los parámetros de los nodos cambien de forma dinámica según los datos. Puedes cambiar cualquier campo de parámetro al modo Expression (con el selector Fixed / Expression junto al campo o escribiendo {{ directamente).

Dentro de {{ }} se escribe JavaScript, así que puedes usar su sintaxis y sus métodos.

Leer los datos actuales: $json

{{ $json.name }}
{{ $json.address.city }}
{{ $json.tags[0] }}
{{ $json["nombre del campo"] }}

Si el nombre del campo contiene espacios o caracteres especiales, usa corchetes [...].

La forma más sencilla es arrastrar un campo desde el panel INPUT de la izquierda hasta el parámetro. n8n generará automáticamente la expresión correcta.

El nodo Edit Fields usa expresiones para generar un mensaje
Edit Fields: arrastra un campo de INPUT desde la izquierda a la expresión; OUTPUT muestra al instante el mensaje combinado

Leer datos de otros nodos: $('nombre del nodo')

$json solo puede leer la salida del nodo anterior. Para leer datos de un nodo anterior:

{{ $('Google Sheets').item.json.email }}
SintaxisSignificado
$('nodo').itemEl elemento correspondiente a los datos actuales (el más habitual)
$('nodo').first()El primer elemento que genera ese nodo
$('nodo').last()El último elemento
$('nodo').all()Todos los items (array)
{{ $('Webhook').item.json.body.customer_id }}
{{ $('Obtener configuración').first().json.api_url }}
{{ $('Pedidos').all().length }} pedidos

Si cambias el nombre de un nodo, n8n actualizará automáticamente el nombre en las expresiones.

Procesar texto

{{ $json.name.trim() }}
{{ $json.email.toLowerCase() }}
{{ $json.title.slice(0, 50) }}…
{{ $json.text.replaceAll('\n', ' ') }}
{{ `Hola ${$json.name}, tu pedido ${$json.order_id} ya se ha enviado.` }}
{{ $json.tags.join('、') }}

n8n también ofrece algunos métodos adicionales:

{{ $json.email.isEmail() }}
{{ $json.content.extractUrl() }}
{{ $json.title.toTitleCase() }}

Números

{{ $json.price * 1.05 }}
{{ Math.round($json.score * 10) / 10 }}
{{ Number($json.amount).toLocaleString('zh-TW') }}
{{ ($json.done / $json.total * 100).toFixed(1) }}%

A veces, los números que devuelve una API son cadenas. Convierte el valor con Number() antes de calcular.

Condiciones

{{ $json.amount > 1000 ? 'VIP' : 'Normal' }}
{{ $json.nickname || $json.name }}
{{ $json.phone ?? 'No proporcionado' }}

Si necesitas seguir flujos distintos según una condición, usa los nodos If o Switch en lugar de gestionar la condición en una expresión.

Arrays

{{ $json.items.length }}
{{ $json.items.map(i => i.name).join(', ') }}
{{ $json.items.filter(i => i.stock === 0).length }}
{{ $json.scores.reduce((a, b) => a + b, 0) }}

Fecha y hora

n8n incluye la biblioteca de fechas Luxon. $now representa la hora actual y $today el inicio del día de hoy:

{{ $now.toFormat('yyyy-MM-dd HH:mm') }}
{{ $today.minus({ days: 1 }).toFormat('yyyy/MM/dd') }}
{{ $now.plus({ hours: 2 }).toISO() }}
{{ $now.setZone('Asia/Taipei').toFormat('dd/MM HH:mm') }}
{{ $now.weekday }}                      // 1 = lunes … 7 = domingo

Para analizar una cadena de fecha de los datos:

{{ DateTime.fromISO($json.created_at).toFormat('yyyy-MM-dd') }}
{{ DateTime.fromFormat($json.date, 'yyyy/MM/dd').plus({ days: 7 }).toISODate() }}
{{ $json.created_at.toDateTime().diffTo($now, 'days') }}

La zona horaria depende de la configuración de n8n o del flujo de trabajo. Recuerda configurarla como Asia/Taipei.

Variables integradas habituales

VariableContenido
$jsonLos datos actuales
$binaryLos archivos de los datos actuales
$input.all()Todos los items que recibe este nodo
$now, $todayLa hora actual y el día de hoy
$execution.idEl ID de esta ejecución
$execution.modetest (prueba manual) o production
$workflow.nameEl nombre del flujo de trabajo
$vars.nameVariables personalizadas (disponibles en algunos planes)
$runIndexEl número de ejecución de este nodo durante esta ejecución

Varias líneas y lógica compleja

Puedes escribir una función autoinvocada en una expresión:

{{ (() => {
  const total = $json.items.reduce((s, i) => s + i.price * i.qty, 0);
  return total >= 1000 ? total : total + 60;
})() }}

Pero si la lógica ocupa más de unas pocas líneas, te recomendamos usar el nodo Code, que resulta más fácil de leer y depurar.

Consejos para depurar

  • Debajo del campo de expresión aparece una vista previa del resultado en tiempo real; el color rojo indica un error.
  • La vista previa usa los datos de la ejecución anterior. Ejecuta primero los nodos anteriores para ver la vista previa.
  • Cannot read properties of undefined significa que no existe alguno de los niveles de la ruta. Usa ?. para evitar el error: {{ $json.address?.city }}.
  • Para ver todos los datos: {{ JSON.stringify($json) }}.

Actualizado 12 de octubre de 2026