n8n-guidelines

Код внутри n8n: как JavaScript и Python делают автоматизацию по-настоящему мощной

Код внутри n8n: как JavaScript и Python делают автоматизацию по-настоящему мощной

Границы Low-code. Зачем нужен кастомный код в визуальном редакторе n8n?

Представьте: вы собираете крутую автоматизацию в n8n. Всё идёт гладко — тригер, HTTP-запрос, парсинг ответа, отправка в Slack. Красивая, читаемая схема. Но потом приходит задача: нужно обойти вложенный JSON с тремя уровнями массивов, отфильтровать записи по составному условию и отдать на выход плоский список с переименованными полями.
И тут начинается. Нода Set, потом Split In Batches, потом IF, снова Set, ещё один Merge — и вот ваша аккуратная схема превратилась в так называемого «макаронного монстра»: десятки нод, связанных между собой запутанными стрелками, в которых не разберётся ни коллега, ни вы сами через месяц. При этом вся эта конструкция решает задачу, которую опытный разработчик закрыл бы буквально в 10 строк кода.
Именно в такие моменты становится ясно: визуальный конструктор — это инструмент скорости, но не инструмент безграничных возможностей. У любого low-code есть потолок, и n8n — не исключение. Стандартные ноды отлично справляются с линейными процессами: взять данные, передать, записать. Но сложная бизнес-логика — трансформация данных, хитрые циклы, нестандартные алгоритмы — требует чего-то большего.

Что такое Code Node — и куда пропал Function Node?

Если вы работали с n8n до версии 0.198.0, вы наверняка помните Function Node и Function Item Node. Это были первые попытки платформы дать разработчикам прямой доступ к коду. Они справлялись со своей задачей, но создавали путаницу: два отдельных узла с похожей, но разной логикой работы.
Разработчики n8n это предусмотрели и решили вопрос радикально: оба старых узла были объединены в единый, значительно более мощный инструмент — Code Node. Теперь вместо двух специализированных нод есть одна универсальная, которая умеет работать в двух режимах:
  • Run Once for All Items — код выполняется один раз и получает на вход все элементы сразу (идеально для работы с массивами целиком)
  • Run Once for Each Item — код выполняется отдельно для каждого входящего элемента (подходит для поэлементных трансформаций)
Если в вашем флоу до сих пор встречается function node n8n — знайте, что это легаси, которое работает только на старых версиях. Современный n8n code node — это его прямой наследник и замена.

Когда 10 строк кода лучше 20 нод

Практика показывает несколько сценариев, когда кастомный код в Code Node — это не прихоть, а единственно разумное решение:
  • Трансформация вложенных структур данных: рекурсивный обход JSON, глубокое плоское преобразование массивов
  • Сложная условная логика: многоуровневые IF/ELSE, которые в визуальном редакторе превратятся в ветвящееся дерево нод
  • Агрегация и вычисления: подсчёт сумм, средних, группировка по ключам — то, для чего нет отдельной ноды
  • Форматирование данных под нестандартные требования: специфические форматы дат, кастомные строковые шаблоны, сложный парсинг
  • Дедупликация и слияние: объединение данных из нескольких источников с нестандартными ключами
Code Node — это ваша мастерская прямо внутри визуального редактора. Главное, что этот инструмент одинаково хорошо понимает как «родной» для веба JavaScript, так и любимый специалистами по данным Python. О каждом из них — по порядку.

Нативная мощь: JavaScript и Expressions для динамических данных

JavaScript — это не просто один из двух поддерживаемых языков в n8n. Это буквально кровь платформы: n8n написан на Node.js, и JS-движок встроен в её ядро на самом глубоком уровне. Именно поэтому n8n javascript работает в Code Node без какой-либо дополнительной настройки — с первой же установки, в облаке и на self-hosted.

Expressions: динамика в одну строку

Прежде чем переходить к полноценным скриптам, важно разобраться с более простым инструментом — n8n expression. Выражения позволяют подставлять данные из предыдущих нод прямо в поля любого узла, не заходя в Code Node вообще.
Синтаксис предельно прост: всё, что вы пишете внутри двойных фигурных скобок {{ }}, интерпретируется как JavaScript. Всё за пределами — как обычный текст.

javascript
// Пример выражения в поле ноды
{{ $json.firstName + " " + $json.lastName }}

// Форматирование даты через встроенную библиотеку Luxon
{{ $now.toFormat('dd.MM.yyyy') }}

// Обращение к данным конкретной ноды по имени
{{ $('HTTP Request').item.json.data.userId }}
Выражения — это инструмент для «проброса» данных: взять поле из предыдущей ноды и вставить его в текущую. Ограничение одно: одна строка. Как только логика усложняется — добро пожаловать в Code Node.

Code Node: полноценный JavaScript внутри флоу

В n8n code node открывается полноценный многострочный редактор. Здесь доступны все стандартные возможности JS: работа с массивами через map, filter, reduce, манипуляции со строками, работа с датами, асинхронные операции через async/await.

javascript
// Трансформация массива входящих данных:
// фильтруем только активных пользователей и переформатируем структуру
const items = $input.all();

const result = items
.map(item => item.json)
.filter(user => user.status === 'active')
.map(user => ({
id: user.id,
fullName: `${user.first_name} ${user.last_name}`,
email: user.email.toLowerCase(),
registeredAt: new Date(user.created_at).toLocaleDateString('ru-RU')
}));

return result.map(json => ({ json }));
Ключевые возможности JavaScript в Code Node:
  • Работа с API внутри ноды: поддерживаются async/await и промисы, можно делать HTTP-запросы через встроенный fetch
  • Встроенные переменные n8n: $input, $json, $('NodeName') — всё доступно внутри кода без импортов
  • Внешние npm-пакеты: подключаются через переменную окружения NODE_FUNCTION_ALLOW_EXTERNAL на self-hosted инстансах
Важно понимать ограничения: выполнение JS в n8n Cloud имеет таймаут около 60 секунд. Тяжёлые операции — например, синхронная обработка тысяч элементов в цикле — могут упереться в этот лимит.

Когда JS не справляется

JavaScript идеален для форматирования дат, работы с REST API, парсинга и трансформации JSON-структур любой сложности. Это то, с чем n8n работает нативно, быстро и без настроек. Но что делать, если автоматизация требует работы с тяжёлыми библиотеками данных, машинным обучением или специфическими скриптами, которые уже написаны бэкенд-командой на Python?

Python в n8n: интеграция сложных скриптов, ML и нейросетей

Связка n8n и Python — это Святой Грааль для автоматизации сложных бизнес-процессов в эпоху ИИ. Pandas, NumPy, scikit-learn, Transformers, OpenCV — весь мощный арсенал Python-экосистемы может стать частью вашего рабочего флоу. Сразу оговоримся: это требует чуть более глубокой настройки сервера по сравнению с JavaScript, но результат окупает вложенные усилия многократно.

Настройка окружения: Python в n8n через Docker

N8n python не работает «из коробки» на стандартной установке — Python необходимо добавить в окружение. Рекомендуемый подход: собрать кастомный Docker-образ на базе официального n8nio/n8n.

text
FROM docker.n8n.io/n8nio/n8n:latest

USER root

# Устанавливаем Python и pip в Alpine-based образ
RUN apk add --no-cache python3 py3-pip build-base python3-dev

# Создаём виртуальное окружение
RUN python3 -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# Устанавливаем нужные библиотеки
RUN pip install --no-cache-dir pandas numpy scikit-learn requests

USER node
После сборки образа необходимо также разрешить использование Python-пакетов через переменные окружения:

bash
N8N_RUNNERS_ENABLED=true
N8N_RUNNERS_STDLIB_ALLOW=json,math,datetime,re
N8N_RUNNERS_EXTERNAL_ALLOW=pandas,numpy,scikit-learn

Какие задачи решает n8n Python — и почему не JS

Python выигрывает в конкретных сценариях, где JavaScript просто не имеет эквивалентных инструментов:

Передача данных между нодами и Python-скриптом

Данные из предыдущих нод передаются в Python-скрипт через специальный объект _input. Результат возвращается в стандартном формате n8n — список объектов с ключом json.

python
import pandas as pd
import json

# Получаем данные из предыдущей ноды
items = _input.all()
records = [item.json for item in items]

# Обрабатываем через Pandas
df = pd.DataFrame(records)
df['revenue'] = df['price'] * df['quantity']
df['category'] = df['revenue'].apply(
lambda x: 'A' if x > 10000 else ('B' if x > 3000 else 'C')
)

# Возвращаем результат обратно во флоу n8n
result = df[['id', 'product_name', 'revenue', 'category']].to_dict('records')
return [{'json': r} for r in result]

Реальный кейс: как Python сэкономил часы работы

Компания из e-commerce сектора еженедельно получала от поставщиков прайс-листы в Excel — сотни строк с разной структурой заголовков, нестандартными форматами цен и кириллическими названиями. Раньше менеджер тратил 3–4 часа в неделю, чтобы вручную привести их к единому виду и загрузить в CRM.
После внедрения флоу в n8n с Python-скриптом внутри Code Node весь процесс стал занимать 40 секунд: файл прилетает на почту, тригер запускает флоу, Python через pandas и openpyxl нормализует структуру, классифицирует товары и возвращает готовый JSON, который следующая нода отправляет напрямую в API CRM. Нулевое участие человека, нулевые ошибки ручного ввода.
Написать такой скрипт — это действительно полдела. Главная проблема бизнеса кроется в другом: как поддерживать и масштабировать подобные гибридные архитектуры в долгосрочной перспективе.

Безопасность, архитектура и делегирование: почему бизнесу нужны профессионалы

Вот сценарий, который встречается в компаниях регулярно. Один энтузиаст автоматизировал половину бизнес-процессов: чуть-чуть JS тут, немного n8n python там, десятки нод, несколько кастомных скриптов. Всё работало. А потом этот человек уволился — и вся система превратилась в неработающий «чёрный ящик». Никто не знает, что делает тот или иной флоу, почему там написан именно этот код, и что произойдёт, если изменить одну ноду.

Риски бесконтрольного кода: память и таймауты

Кастомный код в n8n — это не просто «текст в поле». Это живой процесс, который потребляет серверные ресурсы. И при неправильном написании он превращается в источник серьёзных проблем:
Утечки памяти возникают, когда Code Node накапливает данные в переменных между запусками, использует глобальные объекты или создаёт замыкания, которые не освобождают память. На высокочастотных триггерах (каждую минуту, каждые 5 секунд) такая утечка за несколько часов роняет весь сервер.
Таймауты — ещё одна типичная проблема. n8n Cloud ограничивает выполнение Code Node примерно 60 секундами. Self-hosted инстансы требуют явной настройки переменной EXECUTIONS_TIMEOUT. Тяжёлый Python-скрипт без оптимизации или JS-цикл по десяткам тысяч элементов запросто превысит лимит.
Типичные антипаттерны, которые нужно исключать:
  • global и process references внутри function node n8n / Code Node
  • Синхронная обработка больших массивов без пагинации
  • HTTP-запросы внутри Code Node без таймаутов
  • Отсутствие обработки ошибок (try/catch)

Как строить архитектуру, которую можно поддерживать

Хорошо спроектированная n8n-автоматизация с кастомным кодом строится по нескольким принципам:
  1. Принцип единственной ответственности: один Code Node решает одну конкретную задачу, а не пять сразу
  2. Явные входы и выходы: скрипт всегда получает чётко определённую структуру данных и возвращает предсказуемый формат
  3. Документирование через имена нод: каждая нода и каждый скрипт должны иметь говорящее название — «Normalize Price Format», а не «Code 3»
  4. Обработка ошибок: использование Error Trigger нод для перехвата сбоев и уведомления команды
  5. Разделение логики: сложные Python-скрипты лучше выносить во внешние микросервисы (FastAPI/Flask), а n8n использовать как оркестратор
  6. Версионирование: хранение флоу в Git через экспорт JSON для возможности отката

Когда стоит обратиться к интегратору

Самостоятельная разработка автоматизации оправдана, пока речь идёт о простых флоу с несколькими нодами. Как только в проект входит n8n python, кастомный JS-код, серверная инфраструктура и требования к отказоустойчивости — цена ошибки резко возрастает.
Заказывать разработку у профессиональной команды выгоднее в таких ситуациях:
  • Автоматизация завязана на критические бизнес-процессы (продажи, финансы, логистика)
  • В флоу используется код, который должен пройти code review и тестирование
  • Нужна настройка серверного окружения с Python, мониторинг и алерты
  • Требуется масштабирование существующих флоу без риска поломки
  • После ухода разработчика система перестала работать или стала нечитаемой
Мы — команда интеграторов, которая не просто собирает флоу в n8n, а строит отказоустойчивые системы уровня enterprise. Пишем безопасный код, проводим code review JS и Python-скриптов, настраиваем серверную инфраструктуру с нужными зависимостями и гарантируем, что автоматизация будет работать как часы — даже когда команда меняется.
Оставьте заявку на аудит ваших процессов или сборку с нуля — покажем, как заставить n8n приносить деньги, а не головную боль.