Перейти к содержанию

Code node в n8n: JavaScript, Python, items и безопасная трансформация данных

Обновлено: 2026-05-29

Открыть мой план

Code node нужен не для того, чтобы превращать n8n в полноценный backend, а для коротких преобразований данных: нормализовать телефон, собрать ключ дедупликации, развернуть массив в items, посчитать итог, подготовить body для API. Если в Code node начинает жить бизнес-приложение на сотни строк, workflow становится трудно поддерживать.

Рабочее правило

Сначала попробуйте решить задачу через Edit Fields, Filter, IF, Merge, Aggregate и HTTP Request. Code node используйте там, где нужна логика, которую трудно выразить настройками нод.

JavaScript или Python

ЗадачаЛучший выборПочему
Нормализация JSON, строки, массивыJavaScriptбыстрее стартует, естественно работает с JSON
Простые вычисления и маппингJavaScriptменьше ограничений в обычных workflow
Команда пишет на PythonPython, если окружение позволяетудобнее для знакомого синтаксиса
Нужны внешние Python-библиотекиОтдельный сервис или task runnerвстроенный Code node не должен становиться пакетным сервером
HTTP-запрос внутри кодаHTTP Request nodeтак проще логировать, retry и отлаживать

Режимы выполнения

В Code node важен режим. Run Once for All Items выполняет код один раз и даёт доступ ко всему массиву входных items. Это удобно для агрегации, дедупликации и группировки. Run Once for Each Item выполняет код для каждого item отдельно. Это удобно для простой нормализации, но опасно для операций, где нужен общий контекст.

Формат items

n8n передаёт данные как массив items. Каждый item обычно содержит json, а для файлов может содержать binary. Вернуть нужно тоже массив items. Самая частая ошибка — вернуть обычный объект вместо массива или забыть обернуть данные в json.

return items.map(item => ({
  json: {
    ...item.json,
    phone_normalized: String(item.json.phone || '').replace(/\D/g, ''),
    processed_at: new Date().toISOString()
  }
}));

Один item из многих

Для отчётов и сводок часто нужно собрать один результат из множества входных строк:

const total = items.reduce((sum, item) => sum + Number(item.json.amount || 0), 0);
return [{
  json: {
    count: items.length,
    total,
    generated_at: new Date().toISOString()
  }
}];

После такой операции следующая нода получит один item. Это нормально, если дальше отправляется отчёт в Telegram или email. Но если дальше ожидается обработка каждой строки, агрегация сломает логику.

Много items из одного

Если API вернул массив внутри одного поля, разверните его в отдельные items:

const rows = items[0].json.rows || [];
return rows.map(row => ({ json: row }));

После этого можно вести каждую строку через IF, HTTP Request или запись в таблицу.

Дедупликация в Code node

Для webhooks и CRM-заявок часто нужен стабильный ключ. Не используйте текущее время. Соберите ключ из внешнего ID, телефона, email или hash payload:

const crypto = require('crypto');
return items.map(item => {
  const source = item.json.source || 'unknown';
  const stable = item.json.event_id || item.json.order_id || item.json.phone || JSON.stringify(item.json);
  const external_id = crypto.createHash('sha256').update(`${source}:${stable}`).digest('hex');
  return { json: { ...item.json, external_id } };
});

Если ваша среда не разрешает require('crypto'), используйте встроенные возможности окружения или перенесите hash в отдельный сервис/HTTP API.

Binary data: файлы и вложения

Файлы в n8n обычно лежат не в json, а в binary. Не пытайтесь вставить PDF или изображение в JSON как огромную строку, если дальше нужно отправить файл в Drive, Яндекс Диск или email. Сначала проверьте, какая нода создаёт binary property, как она называется и ожидает ли следующая нода это имя. Для преобразования метаданных можно использовать Code node, но сам файл лучше передавать через binary-поток.

Где Code node ломает поддержку

  • внутри спрятана авторизация к API вместо credential;
  • код делает HTTP-запросы, которые трудно повторить и логировать;
  • нет комментариев к нестандартной логике;
  • возвращается разное количество items без предупреждения;
  • ошибки проглатываются try/catch без записи причины.

Ошибки и диагностика

СимптомПричинаЧто сделать
Cannot read properties of undefinedполе отсутствует в части itemsиспользовать optional chaining и значения по умолчанию
Следующая нода не видит полявернули объект не в jsonвозвращать { json: {...} }
Workflow стал медленнымтяжёлый код, большой массив, лишняя сериализацияуменьшить payload, вынести тяжёлую обработку
Python не видит библиотекуограничения окруженияиспользовать JS, task runner или внешний сервис
Потерялись связи itemsизменили количество items без учёта item linkingявно понимать, где один-в-один, где агрегация или split

Связанные материалы

  • Items в n8n — как устроены входные и выходные данные.
  • JavaScript в n8n — примеры трансформаций.
  • Python в n8n — ограничения и сценарии.
  • HTTP Request — когда API лучше вызывать отдельной нодой.
  • JSON parse error — как разбирать ошибки формата.