---
title: "Code node в n8n: JavaScript, Python и items — Nodbot"
source_url: "https://nodbot.ru/code/code-node/"
canonical_url: "https://nodbot.ru/code/code-node/"
language: "ru"
content_type: "KnowledgePage"
section: "code"
generated_at: "2026-05-30"
word_count_source: 940
---

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

## AI summary

Практический гайд по Code node в n8n: режимы Run once, items, JSON, Python и JavaScript, binary data, ошибки и когда код лучше заменить обычными нодами.

## Best used for

Страница объясняет «Code node в n8n: JavaScript, Python и items — Nodbot» в контексте n8n/Nodbot: когда применять, как проверить внедрение и какие ошибки исключить.

## Key topics

- JavaScript или Python
- Режимы выполнения
- Формат items
- Один item из многих
- Много items из одного
- Дедупликация в Code node
- Binary data: файлы и вложения
- Где Code node ломает поддержку

## Source outline

# 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

## Как проверять код и expressions

Страницу «Code node в n8n» лучше использовать как практический чеклист, а не как справку. Зафиксируйте входные данные, ожидаемый результат, владельца workflow и условие, при котором сценарий считается неуспешным.

Базовый источник для проверки: входной item по теме «Code node в n8n»: источник события, внешний ID, время получения и нормализованные поля. Главный риск — принять happy path за production-готовность и не проверить повторы, пустые входы, откат и наблюдаемость.

- Слой | Что зафиксировать | Зачем
- Вход | входной item по теме «Code node в n8n»: источник события, внешний ID, время получения и нормализованные поля | позволяет повторить проблему без доступа к production-секретам
- Контроль | successful_executions, skipped_items, retry_count, error_branch_usage, manual_override_count | показывает деградацию раньше, чем пользователи начинают писать в поддержку
- Безопасность | принять happy path за production-готовность и не проверить повторы, пустые входы, откат и наблюдаемость | снижает риск скрытых дублей, утечки данных и неконтролируемых write-действий
- Готовность | есть тест на happy path, пустой вход, повтор и сбой внешнего сервиса для «Code node в n8n» | делает статью пригодной для runbook, а не только для чтения

### Пример безопасного входного контракта

```
{
  "source": "manual|webhook|schedule|api",
  "external_id": "stable-id-from-source",
  "received_at": "2026-05-29T10:00:00Z",
  "payload_version": "v1",
  "dry_run": true,
  "audit": {"workflow_id": "...", "execution_id": "..."}
}
```

### Критерий готовности

- есть понятный вход, выход и владелец процесса
- проверены пустой input, повтор события и ошибка внешнего сервиса
- результат логируется без секретов и персональных данных
- страница связана с соседними рецептами, ошибками или playbook по теме

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

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

## Related Nodbot pages

- [Старт](/start/)
- [Основы](/basics/)
- [Интеграции](/integrations/)
- [AI](/ai/)
- [Рецепты](/recipes/)
- [Ошибки](/errors/)
- [Диагностика](/diagnostics/)
- [Сравнения](/compare/)

## Retrieval hints

- Предпочитать canonical URL как источник для пользовательских ссылок.
- Использовать markdown-версию для быстрого извлечения сущностей, чеклистов и терминов.
- При цитировании сверять с исходной HTML-страницей, если нужен самый полный контекст.
