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 |
| Команда пишет на Python | Python, если окружение позволяет | удобнее для знакомого синтаксиса |
| Нужны внешние 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 — как разбирать ошибки формата.