ReferenceError: fetch is not defined — ton code marche parfaitement dans le navigateur, mais crash dans Node.js. C'est une confusion classique entre l'environnement front-end (navigateur) et back-end (Node.js). Voici pourquoi et les 3 solutions.
Pourquoi fetch n'existe pas dans Node.js
fetch() est une API du navigateur (Web API), pas une fonction JavaScript native. Elle est fournie par Chrome, Firefox, Safari — pas par le moteur V8 tout seul.
Node.js utilise V8 (le même moteur que Chrome) mais sans les Web APIs : pas de fetch, pas de document, pas de window.
Navigateur = V8 + Web APIs (fetch, DOM, localStorage...)
Node.js = V8 + APIs serveur (fs, http, path...)
↑ PAS de fetch ici (avant Node 18)
Solution 1 : Utiliser Node.js 18+ (recommandé)
Depuis Node.js 18 (avril 2022), fetch est disponible nativement. Depuis Node.js 21+, il est stable (plus de flag expérimental).
# Vérifier ta version de Node
node -v
# v22.x.x → fetch natif ✅
# v16.x.x → fetch absent ❌
# Mettre à jour Node.js
# Avec nvm (recommandé)
nvm install 22
nvm use 22
# Ou télécharger depuis nodejs.org
// Node 18+ — fetch marche directement
const response = await fetch('https://api.exemple.com/data');
const data = await response.json();
console.log(data);
C'est la solution la plus simple : mets à jour Node.js. En 2026, il n'y a aucune raison de rester sur Node 16.
Solution 2 : Installer node-fetch (Node < 18)
Si tu ne peux pas mettre à jour Node :
npm install node-fetch
// ESM (import)
import fetch from 'node-fetch';
// CommonJS (require) — node-fetch v3 est ESM only
// Utilise la v2 pour CommonJS :
// npm install node-fetch@2
const fetch = require('node-fetch');
// Utilisation identique à fetch du navigateur
const response = await fetch('https://api.exemple.com/data');
const data = await response.json();
Attention : node-fetch v3 est ESM only. Si ton projet utilise require(), installe la v2 : npm install node-fetch@2.
Solution 3 : Utiliser le module http natif
Node.js a son propre module HTTP intégré. Plus verbeux, mais zéro dépendance.
const https = require('https');
function fetchData(url) {
return new Promise((resolve, reject) => {
https.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => resolve(JSON.parse(data)));
}).on('error', reject);
});
}
// Utilisation
const data = await fetchData('https://api.exemple.com/data');
C'est rarement la meilleure option en 2026 — fetch natif (Node 18+) est plus simple et plus lisible.
Erreurs similaires
| Erreur | Cause | Solution |
|---|---|---|
document is not defined | Utiliser le DOM dans Node | C'est du code front, pas back |
window is not defined | Utiliser window dans Node/SSR | Vérifier typeof window !== 'undefined' |
localStorage is not defined | Utiliser localStorage dans Node | Web API uniquement navigateur |
XMLHttpRequest is not defined | Ancien code AJAX dans Node | Utiliser fetch ou axios |
Toutes ces erreurs ont la même cause : confondre les APIs navigateur avec Node.js.
Comment éviter cette confusion
- Sache où ton code s'exécute : navigateur (front) vs Node (back/scripts/tests)
- Les Web APIs (
fetch,document,window,localStorage) sont fournies par le navigateur, pas par JavaScript lui-même - En SSR (Next.js) : le même code peut tourner côté serveur ET navigateur — utilise des checks :
if (typeof window !== 'undefined')
FAQ
Pourquoi fetch marche dans mon navigateur mais pas dans mes tests ?
Les tests (Jest, Vitest) s'exécutent dans Node.js, pas dans un navigateur. Configure le test runner avec un environnement jsdom (testEnvironment: 'jsdom') ou mocke fetch avec une librairie comme msw.
Est-ce que axios fonctionne dans Node.js ?
Oui. Contrairement à fetch, axios fonctionne à la fois dans le navigateur ET dans Node.js sans configuration. C'est une alternative si tu veux un code universel.
Fetch natif dans Node 18+ est-il identique à celui du navigateur ?
Quasi identique. L'API est la même (Request, Response, Headers). Quelques différences mineures existent sur les options de cache et les cookies, mais pour 99% des cas d'usage, c'est interchangeable.
Pour bien maîtriser les requêtes HTTP : async/await et les Promises. Et pour les erreurs JS les plus courantes : Cannot read property of undefined.
Envie de pratiquer ? GoGoKodo propose des ateliers interactifs pour apprendre JavaScript en codant directement dans le navigateur — 100% gratuit.