Code Node
Программирование в n8n — JavaScript и Python
Code Node позволяет выполнять произвольный код на JavaScript или Python.
Режимы выполнения
Заголовок раздела «Режимы выполнения»Run Once for All Items
Заголовок раздела «Run Once for All Items»Код выполняется один раз, получая все items:
const items = $input.all();
return items.map(item => ({ json: { ...item.json, processed: true }}));Run Once for Each Item
Заголовок раздела «Run Once for Each Item»Код выполняется для каждого item отдельно:
const item = $input.item;
return { json: { ...item.json, processed: true }};JavaScript
Заголовок раздела «JavaScript»Базовая структура
Заголовок раздела «Базовая структура»// Получить входные данныеconst items = $input.all();
// Обработкаconst results = [];
for (const item of items) { results.push({ json: { original: item.json, modified: transform(item.json) } });}
// Вернуть результатreturn results;Доступ к данным
Заголовок раздела «Доступ к данным»// Все itemsconst items = $input.all();
// Первый itemconst first = $input.first();
// Последний itemconst last = $input.last();
// Данные из другой нодыconst httpData = $('HTTP Request').all();const firstHttpItem = $('HTTP Request').first();
// Переменные окруженияconst apiKey = $env.API_KEY;
// Глобальные переменныеconst baseUrl = $vars.BASE_URL;
// Информация о выполненииconst executionId = $execution.id;const workflowName = $workflow.name;Асинхронные операции
Заголовок раздела «Асинхронные операции»// Async/await поддерживаетсяconst response = await fetch('https://api.example.com/data');const data = await response.json();
return [{ json: data }];External Libraries
Заголовок раздела «External Libraries»// Встроенные библиотекиconst moment = require('moment');const _ = require('lodash');const crypto = require('crypto');
// Использованиеconst formatted = moment().format('YYYY-MM-DD');const unique = _.uniq(items.map(i => i.json.name));const hash = crypto.createHash('sha256').update('data').digest('hex');Работа с Binary
Заголовок раздела «Работа с Binary»// Создание binary из строкиconst buffer = Buffer.from('Hello World');
return [{ json: { fileName: 'test.txt' }, binary: { data: await this.helpers.prepareBinaryData(buffer, 'test.txt') }}];// Чтение binaryconst binaryData = items[0].binary.data;const buffer = await this.helpers.getBinaryDataBuffer(0, 'data');const content = buffer.toString('utf8');Базовая структура
Заголовок раздела «Базовая структура»# Получить входные данныеitems = _input.all()
# Обработкаresults = []
for item in items: results.append({ 'json': { 'original': item['json'], 'processed': True } })
# Вернуть результатreturn resultsДоступ к данным
Заголовок раздела «Доступ к данным»# Все itemsitems = _input.all()
# Первый itemfirst = _input.first()
# Данные из другой нодыhttp_data = _node['HTTP Request'].all()
# Переменные окруженияimport osapi_key = os.environ.get('API_KEY')Библиотеки
Заголовок раздела «Библиотеки»import jsonimport datetimeimport refrom collections import defaultdict
# Использованиеdata = json.loads(items[0]['json']['text'])now = datetime.datetime.now().isoformat()matches = re.findall(r'\d+', text)Паттерны
Заголовок раздела «Паттерны»Фильтрация
Заголовок раздела «Фильтрация»const items = $input.all();
return items.filter(item => item.json.status === 'active');items = _input.all()
return [item for item in items if item['json']['status'] == 'active']Группировка
Заголовок раздела «Группировка»const items = $input.all();
const grouped = items.reduce((acc, item) => { const key = item.json.category; if (!acc[key]) acc[key] = []; acc[key].push(item.json); return acc;}, {});
return Object.entries(grouped).map(([category, items]) => ({ json: { category, items, count: items.length }}));Агрегация
Заголовок раздела «Агрегация»const items = $input.all();
const total = items.reduce((sum, item) => sum + item.json.amount, 0);
const average = total / items.length;
return [{ json: { total, average, count: items.length }}];Merge данных
Заголовок раздела «Merge данных»// Объединение данных из двух нодconst users = $('Get Users').all();const orders = $('Get Orders').all();
return users.map(user => { const userOrders = orders.filter(o => o.json.userId === user.json.id );
return { json: { ...user.json, orders: userOrders.map(o => o.json), orderCount: userOrders.length } };});HTTP запросы
Заголовок раздела «HTTP запросы»const response = await fetch('https://api.example.com/data', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${$env.API_KEY}` }, body: JSON.stringify({ query: $json.query })});
if (!response.ok) { throw new Error(`HTTP ${response.status}`);}
const data = await response.json();return [{ json: data }];Error handling
Заголовок раздела «Error handling»const items = $input.all();const results = [];
for (const item of items) { try { const processed = riskyOperation(item.json); results.push({ json: { success: true, data: processed } }); } catch (error) { results.push({ json: { success: false, error: error.message, original: item.json } }); }}
return results;Debugging
Заголовок раздела «Debugging»Console.log
Заголовок раздела «Console.log»console.log('Debug:', $json);console.log('Items count:', items.length);Логи видны в деталях выполнения.
Throw Error
Заголовок раздела «Throw Error»if (!$json.requiredField) { throw new Error('Required field is missing');}Performance
Заголовок раздела «Performance»Batch processing
Заголовок раздела «Batch processing»const BATCH_SIZE = 100;const items = $input.all();const results = [];
for (let i = 0; i < items.length; i += BATCH_SIZE) { const batch = items.slice(i, i + BATCH_SIZE); const batchResults = await processBatch(batch); results.push(...batchResults);}
return results;Parallel execution
Заголовок раздела «Parallel execution»const items = $input.all();
const results = await Promise.all( items.map(async item => { const data = await fetchData(item.json.id); return { json: data }; }));
return results;Следующие шаги
Заголовок раздела «Следующие шаги»- Expressions — динамические значения
- Трансформация данных — паттерны
- Примеры — готовые решения