Récupération de données depuis des APIs en Node.js
Si vous êtes développeur frontend et que vous écrivez du code Node.js, vous avez probablement pris l’habitude d’utiliser Axios par réflexe, ou vous vous êtes demandé si vous aviez encore besoin de node-fetch. La réponse aujourd’hui est plus simple que vous ne le pensez : Node.js moderne dispose d’une API fetch intégrée et stable, et pour la plupart des cas d’usage, c’est tout ce dont vous avez besoin.
Voici ce que vous devez savoir pour effectuer des requêtes HTTP côté serveur de manière propre et fiable aujourd’hui.
Points clés à retenir
- Node.js moderne intègre une API
fetchglobale propulsée par undici — aucun package à installer. fetchne lève pas d’exception sur les erreurs HTTP comme 404 ou 500. Vérifiez toujoursresponse.okavant de lire le corps de la réponse.- Utilisez
AbortSignal.timeout()pour les délais d’expiration des requêtes au lieu de configurer manuellement unAbortController. - Pour les scénarios à haut débit avec des requêtes répétées vers la même origine, utilisez le
Poold’undici pour la réutilisation des connexions. - Préférez le
fetchnatif à Axios dans les projets exclusivement Node pour garder votre liste de dépendances légère.
L’API Fetch de Node.js est stable et intégrée
Depuis Node.js 18, fetch est disponible globalement sans nécessiter d’imports. Elle a été marquée comme expérimentale en v18, puis stabilisée en v21. Elle est propulsée par undici en coulisses — le client HTTP qui soutient l’implémentation fetch de Node — et elle reproduit l’API Fetch du navigateur que vous connaissez déjà.
Pas d’installation. Pas de require('node-fetch'). Juste fetch().
const response = await fetch("https://api.github.com/users/nodejs/repos", {
headers: { "User-Agent": "my-app" },
})
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`)
}
const repos = await response.json()
console.log(repos.map((r) => r.name))
Un point important à comprendre : fetch ne lève pas d’exception sur les erreurs HTTP comme 404 ou 500. Elle ne lève d’exception qu’en cas d’échec réseau. Vérifiez toujours response.ok ou response.status avant de lire le corps de la réponse.
Effectuer des requêtes POST avec l’API Fetch de Node.js
L’envoi de données est simple. Définissez method, ajoutez un en-tête Content-Type, et sérialisez votre payload :
const response = await fetch("https://api.example.com/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ title: "Hello", body: "World" }),
})
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`)
}
const data = await response.json()
Pour les téléversements FormData, omettez complètement l’en-tête Content-Type — fetch le définit automatiquement avec la bonne limite multipart.
Gérer les délais d’expiration avec AbortSignal
Il n’existe pas d’option de timeout intégrée dans l’appel fetch lui-même, mais AbortSignal.timeout() rend cela simple :
const response = await fetch("https://api.example.com/data", {
signal: AbortSignal.timeout(5000), // 5 secondes
})
Si la requête dépasse la limite, elle est annulée. Aucune configuration manuelle d’AbortController n’est nécessaire pour le cas simple.
Pour des scénarios plus complexes — par exemple si vous souhaitez annuler une requête suite à une action utilisateur et appliquer un timeout — vous pouvez combiner un AbortController avec AbortSignal.any() :
const controller = new AbortController()
const response = await fetch("https://api.example.com/data", {
signal: AbortSignal.any([
controller.signal,
AbortSignal.timeout(5000),
]),
})
// Appelez controller.abort() ailleurs pour annuler manuellement
Discover how at OpenReplay.com.
Quand utiliser Undici directement
Pour la plupart des requêtes API Node.js, le fetch global est l’outil approprié. Mais si vous effectuez de nombreuses requêtes vers la même origine — comme interroger un service interne de manière répétée — le Pool d’undici vous offre la réutilisation des connexions et un contrôle plus fin.
import { Pool } from "undici"
const pool = new Pool("https://internal-api.example.com", {
connections: 10,
})
const { statusCode, body } = await pool.request({
path: "/data",
method: "GET",
})
const data = await body.json()
Notez que pool.request() retourne un body qui est un flux lisible, et non un objet Response. Vous devez le consommer explicitement — par exemple avec body.json() ou body.text().
Utilisez undici directement lorsque vous avez besoin de pooling avancé, de streaming efficace de grandes réponses, ou de débit maximal dans du code sensible aux performances.
Fetch Node.js vs Axios : lequel utiliser ?
| Fetch natif | Axios | |
|---|---|---|
| Installation requise | Non | Oui |
| Compatible navigateur | Oui | Oui |
| Analyse JSON automatique | Non (appeler .json()) | Oui |
| Intercepteurs | Manuel | Intégré |
| Lève exception sur erreurs HTTP | Non | Oui |
| Option timeout | AbortSignal | Intégré |
Axios reste un choix solide si vous voulez des intercepteurs, une analyse JSON automatique, ou un comportement cohérent entre navigateur et Node dans la même base de code. Mais si vous écrivez du code exclusivement Node et que vous n’avez pas besoin de ces extras, le fetch natif garde votre liste de dépendances propre.
Évitez node-fetch pour les nouveaux projets. C’était la bonne solution avant Node 18, mais elle est désormais redondante sur toute version supportée de Node.js.
Conclusion
Pour les requêtes HTTP côté serveur dans Node.js moderne, commencez avec le fetch intégré. Il est stable, familier, et ne nécessite rien de plus. Ajoutez AbortSignal.timeout() pour les timeouts, vérifiez response.ok pour les erreurs, et n’utilisez le Pool d’undici que lorsque les performances l’exigent. Gardez Axios dans votre boîte à outils si vous avez réellement besoin de ses fonctionnalités de plus haut niveau — mais ne l’installez pas par défaut.
FAQ
Oui. L'API fetch globale a été introduite comme expérimentale dans Node.js 18 et est devenue stable dans Node.js 21. Elle est propulsée par undici et ne nécessite aucun package supplémentaire. Toute version actuellement supportée de Node.js l'inclut d'office.
Par conception, fetch ne rejette la promesse qu'en cas d'échecs au niveau réseau tels que des erreurs de résolution DNS ou des connexions perdues. Les codes de statut d'erreur HTTP comme 404 ou 500 sont considérés comme des réponses valides. Vous devez vérifier vous-même response.ok ou response.status avant de traiter le corps de la réponse.
Oui, il n'y a pas de conflit. Certaines équipes utilisent fetch natif pour les requêtes simples et Axios lorsqu'elles ont besoin d'intercepteurs ou de levée automatique d'erreurs. Cela dit, mélanger les clients HTTP ajoute de la complexité, donc choisissez-en un par défaut et n'utilisez l'autre que lorsque ses fonctionnalités spécifiques sont nécessaires.
Utilisez undici directement lorsque vous avez besoin de pooling de connexions, d'un contrôle fin sur les connexions HTTP, ou d'un débit maximal pour des requêtes répétées vers la même origine. Pour les appels API typiques où la simplicité compte plus que les performances brutes, le fetch global est suffisant.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.