Nodes, triggers, and your first workflow
How the n8n canvas works: node types, items as the data format, expressions with $json, and your first scheduled workflow.
Lesson content is currently available in Russian.
What you will learn
- →Различать trigger-ноды и обычные ноды и объяснять, как items текут через workflow.
- →Читать и писать expressions с $json, $now и данными других нод.
- →Собрать и активировать первый workflow по расписанию с HTTP-запросом и фильтром.
Canvas, ноды и items: как n8n думает о данных
n8n — визуальный оркестратор: workflow собирается на canvas из нод, соединённых стрелками-connections. Нод два класса. Триггеры запускают выполнение и не имеют входа: Manual Trigger (кнопка Test workflow), Schedule Trigger (расписание), Webhook (входящий HTTP-запрос), Chat Trigger (сообщение в чате). Обычные ноды принимают данные, выполняют действие и передают результат дальше: HTTP Request, Edit Fields (Set), IF, Code.
Ключевая идея, без которой n8n кажется магией: между нодами течёт не «одно значение», а массив items. Каждый item — объект с ключом json (и опционально binary для файлов):
[
{ "json": { "email": "ann@acme.io", "score": 42 } },
{ "json": { "email": "bob@acme.io", "score": 17 } }
]
Большинство нод выполняют операцию для КАЖДОГО item: если на вход HTTP Request пришло пять items, нода сделает пять запросов. Отсюда типичное недоумение новичка «почему письмо ушло три раза» — потому что на входе было три item.
Каждый запуск сохраняется в списке Executions: откройте любой прогон, кликните по ноде — увидите её реальные input и output. Для отладки используйте pin data: закрепите выход ноды, и следующие прогоны будут брать закреплённые данные вместо реальных запросов к API.
Expressions: {{ $json }} и данные из других нод
Expressions — способ подставлять динамические значения в параметры нод. Синтаксис: двойные фигурные скобки, внутри — JavaScript. Базовые случаи:
{{ $json.email }}— поле текущего item;{{ $json.user.address.city }}— вложенное поле через точку;{{ $('Webhook').item.json.body.name }}— данные из любой ноды выше по потоку, по её имени;{{ $now.toISO() }}— текущее время (Luxon DateTime),{{ $today }}— дата;{{ $itemIndex }}— номер текущего item,{{ $execution.id }}— id прогона;{{ $env.MY_VAR }}— переменная окружения (только self-hosted).
Так выглядит конфигурация ноды Edit Fields (Set) в экспортированном JSON — знак = в начале значения означает «вычислить как expression»:
{
"assignments": [
{ "name": "fullName", "value": "={{ $json.first + ' ' + $json.last }}", "type": "string" },
{ "name": "receivedAt", "value": "={{ $now.toISO() }}", "type": "string" }
]
}
Редактор expressions показывает результат на живых данных предыдущей ноды — пользуйтесь этим вместо запусков «вслепую». Антипаттерн: собирать JSON конкатенацией строк в Code node там, где хватает Edit Fields с двумя expressions. Чем больше логики видно прямо на canvas, тем дешевле поддержка workflow.
Первый workflow: Schedule Trigger → HTTP Request → фильтр → уведомление
Соберём первый настоящий workflow — ежедневный дайджест погоды.
Schedule Trigger: Trigger Interval = Custom (Cron), выражение0 8 * * *— каждый день в 08:00 по таймзоне инстанса (настройкаGENERIC_TIMEZONE).HTTP Request: метод GET, URLhttps://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35&daily=temperature_2m_max&timezone=auto. API без ключа — идеально для тренировки. Ответ станет item со всей структурой прогноза.IF: условие Number →{{ $json.daily.temperature_2m_max[0] }}→ larger →25. Ветка true — жара, ветка false — обычный день.Edit Fields (Set): соберите текст сообщения, например={{ 'Завтра до ' + $json.daily.temperature_2m_max[0] + '°C' }}.- Нода отправки: Telegram, Slack или Gmail — любая, для которой настроите credentials.
Кнопка Test workflow запускает прогон вручную прямо в редакторе — данные видны на каждой ноде. Тумблер Active включает production-режим: с этого момента Schedule Trigger срабатывает сам, а прогоны попадают в список Executions (в редакторе их не видно — это второе по популярности недоумение новичка).
Правило: сначала добейтесь зелёного ручного прогона с данными на каждой ноде, потом активируйте. Отлаживать активный workflow по логам мучительнее, чем прогнать его вручную ещё раз.
Гигиена workflow: паттерны и антипаттерны
Workflow живут долго, и через месяц их читаешь как чужой код. Дисциплина с первого дня окупается.
Паттерны. Переименовывайте ноды по смыслу: «Получить прогноз», а не «HTTP Request1» — на имена нод ссылаются expressions вида $('Получить прогноз'), и осмысленные имена делают формулы самодокументируемыми. Расставляйте Sticky Notes — заметки прямо на canvas, объясняющие блоки. Один workflow — одна задача: «принять лид», «отправить дайджест»; крупные процессы делите на под-workflow (нода Execute Sub-workflow). Прибейте тестовые данные через pin data, чтобы не дёргать платные API при каждой правке.
Антипаттерны. Один гигантский Code node, который делает всё, — так теряется главное преимущество n8n: наблюдаемость каждого шага в executions. Секреты в URL или заголовках прямо в ноде — они попадут в экспортированный JSON (правильное место — credentials, урок 6). Workflow без обработки ошибок в production — до урока 5 это простительно, после — нет.
Простой тест зрелости: если назначение ноды нельзя объяснить одной фразой, нода делает слишком много — делите.
Practice
Утренний дайджест погоды
Соберите workflow: Schedule Trigger (cron 0 8 * * *) → HTTP Request к open-meteo → IF по температуре → Edit Fields с текстом сообщения → отправка в Telegram, Slack или на почту. Прогоните вручную через Test workflow, затем активируйте.
Deliverable
Экспортированный JSON workflow и скриншот успешного execution с данными на каждой ноде.
Checkpoint
Объясните на своём workflow, как items проходят от триггера до последней ноды и где какие expressions вычисляются.
- ✓ Названы типы нод (триггер и обычные) и их роль в workflow.
- ✓ Показано, что данные — это массив items, и объяснено, как нода обрабатывает несколько items.
- ✓ Приведён хотя бы один рабочий expression с $json и объяснено, откуда берётся значение.
Check yourself
Sources