// Start

Dane, items i wyrażenia

▸ // rozdziały lekcji

Dane w n8n - Wolniś patrzy, jak jeden item zamienia się w 32

Ludzie, którzy przychodzą do n8n z Make albo Zapiera, najczęściej wykładają się na dwóch rzeczach. Pierwsza: nie wiedzą, ile razy węzeł się wykona. Druga: nie wiedzą, jak wyciągnąć jedno pole z odpowiedzi, która wygląda jak ściana nawiasów. Obie rzeczy da się wyjaśnić na jednym przykładzie i to właśnie zrobimy.

Przykład z tej lekcji pobiera tabelę kursów walut z Narodowego Banku Polskiego i zamienia ją na 32 czytelne wiersze. Działa bez żadnego konta.

JSON w pięć minut

Każdy węzeł w n8n oddaje dane w formacie JSON. Tak wygląda skrócona odpowiedź z API NBP:

{
  "table": "A",
  "effectiveDate": "2026-09-23",
  "rates": [
    { "currency": "dolar amerykański", "code": "USD", "mid": 3.8175 },
    { "currency": "euro", "code": "EUR", "mid": 4.3588 }
  ]
}

Trzy rzeczy wystarczą, żeby to czytać:

  • obiekt to nawiasy klamrowe. W środku są pary nazwa i wartość, na przykład "effectiveDate": "2026-09-23",
  • pole to jedna taka para. Wartością może być tekst, liczba, prawda albo fałsz, ale też kolejny obiekt albo lista,
  • lista (tablica) to nawiasy kwadratowe. Pole rates to lista obiektów - po jednym na walutę.

Zamiast czytać surowy JSON, w panelu węzła przełącz widok na tabelę albo schemat. Dane są te same, tylko łatwiej je ogarnąć wzrokiem.

Items, czyli dlaczego pętla dzieje się sama

Między węzłami nie płynie jeden JSON, tylko lista elementów. n8n nazywa je items. Liczbę items widzisz nad danymi wyjściowymi każdego węzła.

I tu jest najważniejsza zasada w całym n8n: większość węzłów wykonuje się raz dla każdego itemu. Dostaje 32 items, robi swoją robotę 32 razy i oddaje 32 wyniki. Nie budujesz pętli - pętla dzieje się sama.

Zobacz to na przykładzie z tej lekcji:

  1. Tabela kursow NBP oddaje 1 item. W środku jest pole rates z listą 32 walut.
  2. Rozbij waluty (węzeł Split Out) bierze tę listę i zamienia ją na 32 items - każda waluta osobno.
  3. Wybierz pola (węzeł Edit Fields) wykonuje się 32 razy, raz dla każdej waluty.

Kanwa po uruchomieniu - liczby items na połączeniach: 1, 1, 32, 32

Haczyk. Lista wewnątrz jednego itemu to nie to samo co 32 items. Gdybyś pominął węzeł Split Out, Edit Fields wykonałby się raz i musiałbyś sam grzebać w liście rates. Jeśli węzeł wykonuje się raz, a ty spodziewasz się wielu wyników - sprawdź, czy dane nie siedzą w liście w środku jednego itemu.

Węzeł Split Out omawiam szczegółowo w dziale o węzłach. Na razie zapamiętaj: lista w polu zamienia się w osobne items właśnie nim.

Wyrażenia - podwójne klamry

W każdym polu węzła możesz wpisać stałą wartość albo wyrażenie. Nad polem jest przełącznik Fixed / Expression. Wyrażenie to kawałek kodu w podwójnych nawiasach klamrowych, który n8n wylicza dla każdego itemu osobno.

Najprostsze wyrażenie wyciąga pole z bieżącego itemu:

{{ $json.currency }}

$json to dane itemu, który węzeł właśnie przetwarza. Dla pierwszego itemu wyjdzie „bat (Tajlandia)", dla drugiego „dolar amerykański" i tak dalej.

Nie musisz tego pisać ręcznie. Otwórz węzeł, znajdź pole w panelu wejścia po lewej i przeciągnij je na pole parametru. n8n sam wpisze wyrażenie.

Węzeł Wybierz pola - pola wejściowe po lewej i wyrażenia z podglądem wyniku

Pro-tip. Pod polem z wyrażeniem n8n pokazuje podgląd wyniku dla bieżącego itemu. Jeśli podgląd jest pusty albo czerwony, wyrażenie nie trafia w dane. Poprawiasz, zanim uruchomisz cały workflow.

Wyrażenia z tej lekcji, jedno po drugim

W węźle „Wybierz pola" jest sześć wyrażeń. Każde pokazuje inną rzecz, którą będziesz robić codziennie.

PoleWyrażenieCo robi
waluta{{ $json.currency }}bierze pole z bieżącego itemu
kod{{ $json.code }}to samo, inne pole
kurs{{ $json.mid }}liczba, a nie tekst - typ pola ustawiony na Number
za_100{{ ($json.mid * 100).toFixed(2).replace('.', ',') + ' zł' }}liczy i formatuje: dwa miejsca po przecinku, polski przecinek, dopisek „zł"
data_tabeli{{ $('Tabela kursow NBP').item.json.effectiveDate }}sięga do wcześniejszego węzła po pole, którego nie ma w bieżącym itemie
pobrano{{ $now.toFormat('yyyy-MM-dd HH:mm') }}bieżąca data i godzina w wybranym formacie

Dwa z nich wymagają słowa komentarza.

Odwołanie do wcześniejszego węzła. Po rozbiciu na waluty data tabeli zniknęła z itemów - została w węźle „Tabela kursow NBP". Zapis $('Tabela kursow NBP').item znaczy: „weź z tamtego węzła item, z którego powstał ten bieżący". n8n pamięta, który item z którego się wziął, i sam trafia w dobry.

Data i godzina. $now to bieżąca chwila w strefie czasowej twojej instancji. Metoda toFormat przyjmuje wzór: yyyy to rok, MM miesiąc, dd dzień, HH:mm godzina i minuty.

Haczyk. Nazwa węzła w odwołaniu musi się zgadzać co do znaku. Jeśli zmienisz nazwę węzła „Tabela kursow NBP", n8n poprawi odwołania automatycznie, ale tylko w tym workflow. Wyrażenia skopiowane z innego workflow albo z internetu poprawisz sam.

Uruchom i sprawdź

  1. Wklej plik z tej lekcji na pustą kanwę.
  2. Kliknij Execute workflow.
  3. Otwórz „Wybierz pola" i przełącz widok na tabelę.

Zobaczysz 32 wiersze: nazwa waluty, kod, kurs, wartość 100 jednostek w złotych, data tabeli i godzina pobrania.

Dane wyjściowe węzła Wybierz pola w widoku tabeli - 32 waluty

Teraz pobaw się tym. Zmień * 100 na * 1000. Dopisz pole z wyrażeniem {{ $json.code === 'EUR' }} i zobacz, który wiersz dostanie true. Po kwadransie takiego grzebania wyrażenia przestają straszyć.

Pokaż JSON do skopiowania - dane-kursy-walut-nbp.json
{
  "name": "Dane i wyrazenia - kursy walut NBP",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "id": "a4d1e001-0000-4000-8000-000000000001",
      "name": "Uruchom recznie"
    },
    {
      "parameters": {
        "url": "https://api.nbp.pl/api/exchangerates/tables/A?format=json",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        220,
        0
      ],
      "id": "a4d1e001-0000-4000-8000-000000000002",
      "name": "Tabela kursow NBP"
    },
    {
      "parameters": {
        "fieldToSplitOut": "rates",
        "options": {}
      },
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        440,
        0
      ],
      "id": "a4d1e001-0000-4000-8000-000000000003",
      "name": "Rozbij waluty"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a4d1e001-0000-4000-8000-0000000000a1",
              "name": "waluta",
              "value": "={{ $json.currency }}",
              "type": "string"
            },
            {
              "id": "a4d1e001-0000-4000-8000-0000000000a2",
              "name": "kod",
              "value": "={{ $json.code }}",
              "type": "string"
            },
            {
              "id": "a4d1e001-0000-4000-8000-0000000000a3",
              "name": "kurs",
              "value": "={{ $json.mid }}",
              "type": "number"
            },
            {
              "id": "a4d1e001-0000-4000-8000-0000000000a4",
              "name": "za_100",
              "value": "={{ ($json.mid * 100).toFixed(2).replace('.', ',') + ' zł' }}",
              "type": "string"
            },
            {
              "id": "a4d1e001-0000-4000-8000-0000000000a5",
              "name": "data_tabeli",
              "value": "={{ $('Tabela kursow NBP').item.json.effectiveDate }}",
              "type": "string"
            },
            {
              "id": "a4d1e001-0000-4000-8000-0000000000a6",
              "name": "pobrano",
              "value": "={{ $now.toFormat('yyyy-MM-dd HH:mm') }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        660,
        0
      ],
      "id": "a4d1e001-0000-4000-8000-000000000004",
      "name": "Wybierz pola"
    }
  ],
  "connections": {
    "Uruchom recznie": {
      "main": [
        [
          {
            "node": "Tabela kursow NBP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tabela kursow NBP": {
      "main": [
        [
          {
            "node": "Rozbij waluty",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rozbij waluty": {
      "main": [
        [
          {
            "node": "Wybierz pola",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false
}

Podsumowanie

Dane w n8n to lista items, a większość węzłów wykonuje się raz dla każdego z nich - pętli nie budujesz. Lista w środku jednego itemu to co innego niż wiele items i właśnie tę różnicę najczęściej widać, kiedy coś „wykonuje się tylko raz". Wyrażenia w podwójnych klamrach czytają pole z bieżącego itemu przez $json, z wcześniejszego węzła przez $('Nazwa węzła').item, a bieżącą datę przez $now.

W lekcji 2.5 - Credentials podłączymy pierwszą usługę, która wymaga klucza, i zobaczysz, gdzie ten klucz trzymać.