// Start

Debugowanie i pin data

▸ // rozdziały lekcji

Debugowanie n8n - Wolniś przypina dane pinezką

Budujesz workflow z modelem AI na końcu. Poprawiasz ostatni węzeł, klikasz Execute workflow, patrzysz na wynik, poprawiasz, klikasz. Dwadzieścia razy. Każde kliknięcie odpytuje wszystkie usługi po drodze, a te płatne liczą za każde zapytanie. Do tego jedno z API ma limit zapytań na minutę i w połowie testów zaczyna odmawiać.

Ta lekcja pokazuje, jak testować bez tego podatku i jak szukać błędów, zamiast zgadywać. Ćwiczymy na cenach złota z API Narodowego Banku Polskiego - działa bez konta.

Testuj jeden krok, nie cały workflow

W panelu każdego węzła jest przycisk Execute step. Uruchamia tylko ten węzeł, a poprzednie węzły tylko wtedy, gdy jeszcze nie mają danych. Poprawiasz trzeci węzeł z pięciu - klikasz Execute step w trzecim. Pierwsze dwa się nie ruszają.

Panel węzła Ceny z przyciskiem Execute step

Pin data - przypnij dane i testuj na nich

Uruchom workflow raz. Otwórz węzeł Cena zlota NBP i w panelu danych wyjściowych kliknij Pin data.

Od tej chwili węzeł przy każdym testowym uruchomieniu oddaje przypięte dane, zamiast odpytywać NBP. Poznasz go po ikonie pinezki na kanwie. Kolejne węzły testujesz na tych samych danych dowolną liczbę razy, za darmo i bez limitów.

Przypięte dane w węźle Cena zlota NBP - komunikat o danych przypiętych do testów

Przypięte dane da się edytować przyciskiem Edit Output. Tak robisz przypadki testowe: zmieniasz cenę na zero, usuwasz pole, dopisujesz dziwny znak - i sprawdzasz, co zrobią dalsze węzły.

Haczyk. Przypięte dane działają tylko przy testach w edytorze. Opublikowany workflow uruchomiony przez harmonogram albo webhook zawsze pobiera prawdziwe dane - n8n pisze to wprost w opisie przycisku. To dobra wiadomość: nie wypuścisz na produkcję workflow, który „działa" tylko na starych danych. Ale pamiętaj o odpięciu, kiedy chcesz zobaczyć świeże dane w edytorze.

Pro-tip. Przypięte dane zapisują się razem z workflow i trafiają do eksportu JSON. Zanim wyślesz komuś plik, odepnij dane z prawdziwymi adresami mailowymi czy danymi klientów.

Ustawienia węzła - co zrobić, gdy się wywali

Otwórz węzeł Cena zlota NBP i przejdź do zakładki ustawień. Są tam dwie rzeczy, których używam w każdym workflow odpytującym zewnętrzną usługę.

Retry On Fail - ponawianie po błędzie. W tym workflow jest włączone z ustawieniami:

  • Max. Tries - 3 próby,
  • Wait Between Tries (ms) - 2000, czyli 2 sekundy przerwy między próbami.

Serwer usługi czkawkę ma częściej, niż myślisz. Druga próba po dwóch sekundach zwykle przechodzi, a ty nie dostajesz alertu o błędzie, który sam by się naprawił.

On Error - co robi workflow, kiedy wszystkie próby zawiodą. Trzy opcje:

  • Stop Workflow - zatrzymuje wszystko. Ustawienie domyślne,
  • Continue - idzie dalej, a błąd trafia do danych jak zwykły wynik,
  • Continue (using error output) - węzeł dostaje drugie wyjście tylko na błędy. Podpinasz pod nie osobną obsługę.

Zakładka Settings węzła - Retry On Fail, Max. Tries, Wait Between Tries i On Error

W tym workflow jest trzecia opcja. Górne wyjście prowadzi do węzła „Ceny", dolne do „Obsluga bledu".

Zepsuj to celowo

Najlepszy sposób, żeby zrozumieć obsługę błędów, to wywołać błąd.

  1. Odepnij dane z węzła Cena zlota NBP.
  2. W adresie zamień last na ostatnie.
  3. Kliknij Execute workflow.

Węzeł spróbuje trzy razy, co zajmie około 4 sekund, a potem wyśle item dolnym wyjściem. W „Obsluga bledu" zobaczysz pole problem z komunikatem 404 - "404 NotFound" i godzinę. Workflow nie zatrzymał się - błąd poszedł swoją gałęzią.

Kanwa po błędzie 404 - item poszedł dolną gałęzią do Obsluga bledu

W prawdziwym workflow pod tę gałąź podpinasz powiadomienie, zapis do tabeli błędów albo wartość zastępczą. Przywróć last w adresie, zanim pójdziesz dalej.

Haczyk. Ponawianie ma sens przy błędach chwilowych: przeciążony serwer, zerwane połączenie, limit zapytań. Przy błędzie 404 albo złym kluczu API trzecia próba skończy się tak samo jak pierwsza. Tu nie pomoże ponawianie, tylko poprawka.

Historia wykonań

Zakładka Executions nad kanwą pokazuje każde uruchomienie workflow. Uruchomienia zakończone błędem są oznaczone na czerwono. Kliknięcie w wykonanie pokazuje kanwę z danymi dokładnie z tamtej chwili - co każdy węzeł dostał i co oddał.

To podstawowe narzędzie przy workflow, które chodzą same. Harmonogram odpalił się w nocy i coś poszło nie tak? Nie odtwarzasz tego z pamięci. Otwierasz wykonanie z 3:00 i patrzysz na dane.

Otwarte wykonanie z błędem w zakładce Executions z przyciskiem Debug in editor

W otwartym wykonaniu są dwa przyciski:

  • Copy to editor - kopiuje tamten stan workflow do edytora,
  • Debug in editor - wczytuje workflow do edytora z danymi z tamtego wykonania przypiętymi do węzłów. Poprawiasz błąd na dokładnie tych danych, które go wywołały.

Haczyk. Debug in editor na własnej instancji wymaga darmowej rejestracji (Registered Community Edition). Jeśli zamiast tej funkcji widzisz zaproszenie do wykupienia planu, wróć do lekcji 1.4 i zrób rejestrację - to dwie minuty i zero złotych.

Podsumowanie

Execute step testuje jeden węzeł. Pin data zamraża odpowiedź usługi, więc testujesz za darmo i bez limitów, a na produkcji i tak lecą prawdziwe dane. W ustawieniach węzła włączasz ponawianie przy błędach chwilowych i osobne wyjście na błąd. Historia wykonań pokazuje dane z każdego uruchomienia, także z tego o 3:00 w nocy.

W lekcji 2.7 - Alert błędów na Discord zbudujesz jeden workflow, który powiadomi cię o błędzie w każdej twojej automatyzacji.

Pokaż JSON do skopiowania - debug-cena-zlota-nbp.json
{
  "name": "Debug - cena zlota z NBP",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "id": "a6d1e001-0000-4000-8000-000000000001",
      "name": "Uruchom recznie"
    },
    {
      "parameters": {
        "url": "https://api.nbp.pl/api/cenyzlota/last/5?format=json",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        220,
        0
      ],
      "id": "a6d1e001-0000-4000-8000-000000000002",
      "name": "Cena zlota NBP",
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 2000,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a6d1e001-0000-4000-8000-0000000000a1",
              "name": "dzien",
              "value": "={{ $json.data }}",
              "type": "string"
            },
            {
              "id": "a6d1e001-0000-4000-8000-0000000000a2",
              "name": "cena_za_gram",
              "value": "={{ $json.cena }}",
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        460,
        -100
      ],
      "id": "a6d1e001-0000-4000-8000-000000000003",
      "name": "Ceny"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a6d1e001-0000-4000-8000-0000000000b1",
              "name": "problem",
              "value": "={{ $json.error.message }}",
              "type": "string"
            },
            {
              "id": "a6d1e001-0000-4000-8000-0000000000b2",
              "name": "kiedy",
              "value": "={{ $now.toFormat('yyyy-MM-dd HH:mm') }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        460,
        100
      ],
      "id": "a6d1e001-0000-4000-8000-000000000004",
      "name": "Obsluga bledu"
    }
  ],
  "connections": {
    "Uruchom recznie": {
      "main": [
        [
          {
            "node": "Cena zlota NBP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cena zlota NBP": {
      "main": [
        [
          {
            "node": "Ceny",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Obsluga bledu",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false
}