Loading
Loading
When you open a new Workflow in n8n, you see the Canvas โ a blank area where you place Nodes and connect them with lines.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ n8n Node Types โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Trigger โ Starts the workflow โ
โ (green) โ Webhook, Schedule, Gmail... โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Regular โ Processes data โ
โ (grey) โ HTTP Request, Set, IF... โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ AI โ AI models โ
โ (purple) โ Anthropic, GPT, Chains... โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Step 1: Schedule Trigger
Step 2: HTTP Request Node
https://jsonplaceholder.typicode.com/posts/1Step 3: Set Node (Transform Data)
processed_title{{ $json.title.toUpperCase() }}Step 4: IF Node (Filter)
{{ $json.userId }} equals 1Step 5: Run and Test
n8n uses {{ }} to access data:
// Access data from previous Node
{{ $json.fieldName }}
// Transform text
{{ $json.title.toUpperCase() }}
{{ $json.email.split("@")[0] }}
// Date and time
{{ $now.toISO() }}
{{ $now.format("YYYY-MM-DD") }}
// Conditional logic
{{ $json.amount > 100 ? "large" : "small" }}
// Data from a specific named Node
{{ $("HTTP Request").first().json.title }}
In any Node's settings โ Settings tab:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ On Error: โ
โ โ Stop Workflow โ
โ โ Continue (Skip the error) โ
โ โ Continue (Use Error Output) โ
โ โ
โ Retry on Fail: โ
โ
โ Max Tries: 3 โ
โ Wait Between Tries: 5s โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ู
ุญุงูุงุฉ n8n Workflow Nodes ุจู Python
# Simulating n8n Workflow Nodes in Python
import json
import time
import urllib.request
from dataclasses import dataclass
from typing import Any
# โโโ Node Classes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class HTTPRequestNode:
"""ู
ุญุงูุงุฉ HTTP Request Node ูู n8n"""
def __init__(self, url: str, method: str = "GET"):
self.url = url
self.method = method
def execute(self, _: dict) -> dict:
req = urllib.request.Request(self.url, method=self.method)
try:
with urllib.request.urlopen(req, timeout=5) as resp:
data = json.loads(resp.read())
print(f" ๐ HTTP {self.method} โ {resp.status}")
return {"success": True, "data": data, "status": resp.status}
except Exception as e:
print(f" โ ๏ธ HTTP Error: {e}")
return {"success": False, "error": str(e), "data": {}}
class SetNode:
"""ู
ุญุงูุงุฉ Set Node โ ูุถูู ุฃู ูุนุฏูู ุญูููุงู"""
def __init__(self, mappings: dict[str, Any]):
self.mappings = mappings
def execute(self, data: dict) -> dict:
result = data.copy()
for key, value in self.mappings.items():
result[key] = value(data) if callable(value) else value
print(f" ๐ Set: ุฃุถุงู {list(self.mappings.keys())}")
return result
class IFNode:
"""ู
ุญุงูุงุฉ IF Node โ ูุดุนูุจ ุณูุฑ ุงูุนู
ู"""
def __init__(self, condition: callable, label: str = ""):
self.condition = condition
self.label = label
def execute(self, data: dict) -> tuple:
passed = self.condition(data)
marker = "โ
True" if passed else "โ False"
print(f" ๐ IF [{self.label}]: {marker}")
return (data, None) if passed else (None, data)
# โโโ ุจูุงุก Workflow โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
print("๐๏ธ ุณูุฑ ุงูุนู
ู: ุฌูุจ ุจูุงูุงุช โ ู
ุนุงูุฌุฉ โ ุชุตููุฉ โ ุฅุดุนุงุฑ")
print("="*55)
# ุงูู Nodes
http_node = HTTPRequestNode("https://jsonplaceholder.typicode.com/users/1")
set_node = SetNode({
"processed_at": lambda _: time.strftime("%Y-%m-%d %H:%M"),
"name_upper": lambda d: d.get("data", {}).get("name", "").upper(),
"email_domain": lambda d: d.get("data", {}).get("email", "@").split("@")[-1],
"is_important": lambda d: d.get("data", {}).get("id", 0) <= 5,
})
filter_node = IFNode(
condition=lambda d: d.get("is_important", False),
label="ุงูู
ุณุชุฎุฏู
ู
ูู
ุ",
)
# โโโ ุชุดุบูู โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
print("\nโถ ุชุดุบูู ุณูุฑ ุงูุนู
ู...")
t0 = time.time()
step1 = http_node.execute({})
step2 = set_node.execute(step1)
passed, rejected = filter_node.execute(step2)
elapsed = round((time.time() - t0) * 1000)
if passed:
print(f"\nโ
ุงูุชู
ู ูู {elapsed}ms")
print(f" ุงูุงุณู
: {passed.get('name_upper')}")
print(f" ุงูุฏูู
ูู: {passed.get('email_domain')}")
print(f" ุงูููุช: {passed.get('processed_at')}")
print(f" ุงูุญุงูุฉ: ู
ูู
โ ุณููุฑุณู ุฅุดุนุงุฑ Slack")
else:
print(f"\nโญ๏ธ ุบูุฑ ู
ูู
โ ุชุฎุทูู ุงูุฅุดุนุงุฑ ({elapsed}ms)")
# โโโ ู
ุญุงูุงุฉ Executions Log โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
print("\n๐ Executions Log:")
for i, node_name in enumerate(["HTTP Request", "Set Fields", "IF Filter"], 1):
status = "โ
" if not (i == 3 and rejected) else "โญ๏ธ"
print(f" {i}. {status} {node_name}")