$('A').item || $('B').item échoue même avec || : n8n résout les deux branches, dont une n'a pas tourné.$json.champ après le Merge.Mini-formation · tiré de 49 conversations
Tout ce que tu as demandé, résolu ou laissé ouvert sur n8n entre juin 2025 et septembre 2026, remis dans l'ordre d'un cours : comprendre, écrire les bonnes expressions, éviter les pièges, brancher images et Pinterest, exploiter le serveur.
n8n est ton orchestrateur. Il enchaîne des étapes (nœuds) qui appellent des services : un script PHP qui pilote WordPress, Google Sheets, OpenAI, Google Drive, l'API Pinterest. Tu ne l'utilises pas pour de grandes architectures : l'essentiel de tes questions porte sur des expressions et des Code nodes qui cassent.
Entre deux nœuds, n8n transporte une liste d'items. Chaque item contient un objet json (les champs) et éventuellement un binary (les fichiers). Un nœud s'exécute une fois par item, sauf indication contraire.
| Besoin | Écriture |
|---|---|
| Champ de l'item courant | {{ $json.prix }} |
| Champ d'un autre nœud, même position | {{ $('Nom du nœud').item.json.prix }} |
| Premier item d'un autre nœud | {{ $('Nom du nœud').first().json.prix }} |
| Nom de champ exotique | {{ $json["N°;Fichier;Prompt"] }} (crochets obligatoires) |
Règle de base : un calcul est une seule expression. Les accolades ne se multiplient pas.
{{ $json.a * $json.b }}{{ $json.a }} * {{ $json.b }}| Je veux… | J'écris |
|---|---|
| Une valeur par défaut | {{ $json.qte ?? 0 }} |
| Forcer une chaîne | {{ String($json.id) }} ou .toString() |
| Tronquer à 15 caractères | {{ $json.titre.substring(0, 15) }} |
| Garder les 5 premiers mots | {{ $json.titre.trim().split(/\s+/).slice(0,5).join(' ') }} |
| Date JJ/MM/AAAA vers AAAA-MM-JJ | {{ $json.date.split('/').reverse().join('-') }} |
| Heure de Paris | toLocaleString('fr-FR', { timeZone: 'Europe/Paris' }) |
{{ $json.titre
.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
.replace(/\s+/g, '-').toLowerCase() }}{{ Number($json.montant.replace('€','').replace(',','.').trim()) }}
// vers une colonne Postgres bigint
{{ Math.round(Number($json.montant.replace('€','').replace(',','.').trim())) }}Vers une colonne real, nettoie le symbole € et la virgule avant l'envoi. Vers bigint, arrondis avec Math.round, sinon Postgres refuse la décimale (l'erreur BIGINT de décembre 2025).
Comment écrire une multiplication dans un champ n8n ?
$('A').item || $('B').item échoue même avec || : n8n résout les deux branches, dont une n'a pas tourné.$json.champ après le Merge.loop1 au lieu de Loop Over Items), ou .item ne sait pas choisir..first() ou $json plutôt que .item.filesystem-v2 est ZmlsZXN5c3RlbS12Mg==), pas l'image.await this.helpers.getBinaryDataBuffer(0, 'data') puis .toString('base64').={{ }}.data.Referer, ou restreindre la clé par IP plutôt que par referer.wp_path erroné. Ce n'est pas n8n.Content-Type: application/json et le chemin du site.Autre erreur, celle du Filter : « Wrong type… expecting a string ». Avec typeValidation: strict, force la valeur en chaîne avec String(...).
Un Merge échoue avec « node is unexecuted ». Solution ?
binary.data.data affiche « filesystem-v2 ». Que faire ?
return {
nom: $json.nom.trim(),
prix: Number(String($json.prix).replace(',', '.')) || 0,
};const vus = new Set();
return $input.all().filter(i => {
const k = i.json.email;
if (vus.has(k)) return false;
vus.add(k);
return true;
});Set (ci-dessus)..txt ou en une ligne JSON.37 k devient 37000, « il y a 2 jours » devient une date.Cas de décembre 2025 : un export avec tabulations, des montants à virgule décimale, parfois sans deux décimales. Le nœud Spreadsheet File lit par défaut avec , et le format anglais.
return $input.all().map(item => {
const d = item.json;
const brut = String(d["Montant(EUROS)"] ?? "").replace(",", ".");
const n = parseFloat(brut);
return { json: {
Date: d["Date"]?.trim() || null,
Libelle: d["Libellé"]?.trim().replace(/\s+/g, " ") || null,
Montant: isNaN(n) ? null : n,
}};
});Décembre 2025 : un message « Insufficient quota » était trompeur. Le vrai défaut : gpt-image-1 avait été branché comme modèle de chat dans un AI Agent LangChain. Ce n'est pas un modèle de chat, il vit sur l'API Images.
gpt-4o, gpt-4.1, gpt-4o-mini), jamais gpt-image-1.const buf = await this.helpers.getBinaryDataBuffer(0, 'data');
return [{ json: { image_b64: buf.toString('base64') } }];C'est la réponse aux conversations « base64 » (septembre 2025, février 2026) : lire le tampon réel plutôt que binary.data.data.
Où se branche gpt-image-1 ?
Ta conversation la plus longue (51 000 caractères, avril 2026) porte sur cet envoi. Décisions retenues :
POST /v5/pins.pins:write et boards:read.id.GET /v5/boards.POST https://api.pinterest.com/v5/pins
Authorization: OAuth2 (credential générique)
Content-Type: application/json
{
"board_id": "{{ $json.board_id }}",
"title": "{{ $json.titre.substring(0, 100) }}",
"link": "{{ $json.url }}",
"media_source": { "source_type": "image_url", "url": "{{ $json.image }}" }
}Le corps ci-dessus est un modèle typique, à ajuster aux champs de ton flux.
n8n tourne dans Docker, conteneur debian-n8n-1. On ne passe pas par npm.
docker compose pull n8n && docker compose up -d n8n
Google n'offre pas d'API pour son gestionnaire. Piste retenue : Vaultwarden auto-hébergé, avec le client Bitwarden sur smartphone.
Toute action WP-CLI passe par pix-flow.com/auto.php avec un wp_path par site. Une erreur 500 ou ECONNREFUSED vient presque toujours de ce script, voir le module 03.
Comment mettre à jour n8n sur le VPS ?
Conclusion de septembre 2026 : l'app générée par IA est la façade, n8n reste l'orchestrateur.
Premières erreurs : ECONNREFUSED, 500, 403, clé API. Le script auto.php et les accès.
Base64 et variables.
Pinterest (24 messages), CSV et format français, BIGINT, intégration d'image par IA.
Calcul, Canva, variable conditionnelle (28 messages), forçage en chaîne, adaptation de code.
Agents IA ; envoi de données Pinterest (la plus longue conversation) ; adaptation de prompts.
Mise à jour de n8n par SSH ; Vaultwarden.
Vérification d'e-mails, correction d'un filtre.
« Utiliser n8n après l'IA » ; extraction YouTube en JavaScript.