fetch is not defined Node.js : Pourquoi et Comment Corriger

4 min de lecture JavaScript

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

ErreurCauseSolution
document is not definedUtiliser le DOM dans NodeC'est du code front, pas back
window is not definedUtiliser window dans Node/SSRVérifier typeof window !== 'undefined'
localStorage is not definedUtiliser localStorage dans NodeWeb API uniquement navigateur
XMLHttpRequest is not definedAncien code AJAX dans NodeUtiliser fetch ou axios

Toutes ces erreurs ont la même cause : confondre les APIs navigateur avec Node.js.

Comment éviter cette confusion

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.