Jak v n8n řešit situaci, kdy potřebuji nastavit “globální” proměnnou pro loopování

n8n je open-source automatizační platforma, který může bez problémů konkurovat Make.com – pokud se nebojíte napsat pár řádků Javascriptu (to je hlavní výhoda, pro kterou n8n používám).

Řešil jsem teď situaci, kdy potřebuji:

  1. přihlásit se k API a získat autorizační token,
  2. stáhnout všechny objednávky za předchozí období (např. den) a
  3. ke každé si zavolat znovu API a získat detailní informace o objednávce.

V čem je problém?

Když chci původně získaný token využít v při druhém volání API (detail objednávky), token se do API requestu vyplní pouze u první objednávky. Při dalším loopování už na něj nedosáhnete a API request selže, protože už není autorizovaný.

Řešení

Je to poměrně drobnost, kterou v Make.com snadno vyřešíte. V n8n na to musíte jinak. Buď můžete pro každou objednávku znovu získávát token a to je sice funkční, ale ne moc elegantní. Logické by bylo získat token jednou a pak ho využít pro každý request. Funguje, ale sám se snažím dělat věci “správně” (pokud mají fungovat dlouho).

Druhá možnost je přidat do flow node Function (nastavení: spuštění kódu pro každý řádek), ve kterém můžete psát Javascript. Tady je ukázka:

// 1 – Vezmeme vstupní data z akuálního řádku
const item = $input.item;

// 2 – Do řádku vložíme token
item.json.token = $('login').item.json.data.token;

// 3 – Vrátíme celý objek řádku obohacený o token
return item;

Vysvětlím to ve větším detailu:

  1. Nejprve vezmeme vstupní data. Data z předchozího modulu je možné vzít přes built-in metodu $input.item více o built-in metodách a proměnných v dokumentaci. Připomenu, že node Function musí být nastavena na běh kódu pro každý řádek.
  2. Do aktuálního řádku vložíme náš token. Ten získáme přes funkci, který umožńuje získávat data z jiných než vstupních nodes – $(’název node’). Pak už je jen potřeba využít dot notation a odkázat na správná data. Uložení do objektu probíhá standardně podle pravidel Javascriptu. Do původního objektu item přidáme nové nové property token. Proč je to item.json.token a ne jen item.token? S tím jsem se dost natrápil a je to dané způsobem, jakým v n8n fungují datové struktury.
  3. Nakonec data vrátíme celý objekt, abychom ho mohli využít v dalším kroky.

Ke každému řádku jsme přidali token a tak ho můžeme pro API call využít.

Snad je to srozumitelné :smile:. n8n je boží a vmnoha ohledech předhání i Make.com. Ale pořád je to trochu geekovina. Asi bych se už měl hecnout a udělat nějaké větší představení.

Díky za feedback!

1 Like