## Introduction

Les applications Node.js dépendent fortement des communications réseau, que ce soit pour servir des requêtes HTTP, se connecter à des bases de données ou appeler des API externes. Lorsque les choses tournent mal, la capacité à diagnostiquer et résoudre rapidement les problèmes réseau est essentielle. Ce guide fournit des techniques pratiques pour dépanner les problèmes réseau de Node.js, en mettant l'accent sur la résolution DNS, les conflits de ports, les échecs de connectivité, et plus encore.

Nous explorerons des scénarios courants avec des commandes concrètes, les sorties attendues et les étapes de récupération. Les exemples sont conçus pour les développeurs et les ingénieurs DevOps travaillant avec Node.js en production ou en développement. À la fin, vous aurez une approche structurée pour identifier et corriger les problèmes liés au réseau dans vos applications Node.js.

## Inventaire de la version et de l'environnement

Avant de plonger dans le dépannage, établissez une image claire de votre environnement. Cela inclut la version de Node.js, le système d'exploitation et toute configuration réseau pertinente.

1. Vérifier la version de Node.js Exécutez node -v pour voir la version installée. C'est important car le comportement réseau peut changer entre les versions. Par exemple, Node.js 18 a introduit une nouvelle implémentation de résolution DNS qui pourrait affecter les performances.

node -v
# Sortie : v20.11.0 
 2. Vérifier la version de npm Bien que pas directement lié au réseau, npm est souvent utilisé pour installer des bibliothèques réseau. Utilisez npm -v .

npm -v
# Sortie : 10.2.4 
 3. Identifier le système d'exploitation Sur Linux/macOS, utilisez uname -a . Sur Windows, utilisez systeminfo . Cela aide à comprendre les outils disponibles comme netstat , lsof ou ss .

uname -a
# Sortie : Linux myhost 5.15.0-91-generic #101-Ubuntu SMP ... x86_64 GNU/Linux 
 4. Vérifier les interfaces réseau Utilisez ip addr ou ifconfig pour lister les interfaces et les adresses IP. Cela aide à vérifier que l'interface attendue est active et possède une IP.

ip addr show
# Sortie :
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ... inet 127.0.0.1/8 ...
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... inet 192.168.1.100/24 ... 
 5. Vérifier la configuration DNS Consultez /etc/resolv.conf sur Linux/macOS pour voir quels serveurs DNS sont configurés.

cat /etc/resolv.conf
# Sortie :
# nameserver 8.8.8.8
# nameserver 1.1.1.1 
 6. Tester la résolution de noms d'hôtes Utilisez getent hosts ou nslookup pour tester la résolution d'un domaine.

getent hosts example.com
# Sortie : 93.184.216.34 example.com 
 Ces vérifications de base garantissent que votre environnement est sain avant de commencer à déboguer des problèmes spécifiques à Node.js.

## Chemin de configuration sécurisé

Modifier la configuration réseau peut être risqué. Suivez toujours un chemin sûr : observer, sauvegarder, changer, vérifier et avoir un plan de retour en arrière.

### 1. Observer l'état actuel

Avant de modifier quoi que ce soit, capturez la configuration actuelle. Par exemple, si vous soupçonnez un problème de proxy, vérifiez les variables d'environnement :

env | grep -i proxy
# Sortie : HTTP_PROXY=http://proxy.example.com:8080
# NO_PROXY=localhost,127.0.0.1 

### 2. Sauvegarder les fichiers de configuration

 Si vous devez modifier un fichier comme .npmrc ou un fichier système, faites d'abord une sauvegarde.

cp ~/.npmrc ~/.npmrc.bak 

### 3. Faire un changement minimal

 Si vous devez changer un paramètre de proxy pour Node.js, faites-le de manière ciblée, par exemple dans un .npmrc spécifique au projet ou via des variables d'environnement pour une seule commande.

HTTP_PROXY=http://new-proxy.example.com:8080 npm install 

### 4. Vérifier le changement

 Après le changement, testez le comportement. Par exemple, si vous avez modifié les paramètres de proxy, essayez d'installer un paquet ou de faire une requête réseau.

npm install axios
# Sortie : added 1 package in 2s 

### 5. Plan de retour en arrière

 Si le changement cause des problèmes, revenez à la sauvegarde.

mv ~/.npmrc.bak ~/.npmrc 
 Documentez toujours ce que vous avez changé et pourquoi, afin de pouvoir le défaire si nécessaire.

## Vérification et diagnostics

Un dépannage efficace nécessite une vérification systématique. Utilisez une combinaison d'outils intégrés à Node.js et de commandes externes.

### 1. Utiliser l'inspecteur Node.js

Démarrez votre application avec l'inspecteur activé pour déboguer le code lié au réseau.

node --inspect app.js
# Sortie : Debugger listening on ws://127.0.0.1:9229/... 
 Ensuite, ouvrez Chrome DevTools et attachez-le au débogueur.

### 2. Tester la résolution DNS dans Node.js

Exécutez un script rapide pour résoudre le DNS en utilisant dns.lookup .

const dns = require('dns');
dns.lookup('example.com', (err, address, family) => {
 if (err) console.error('Erreur DNS :', err);
 else console.log('Adresse :', address, 'Famille :', family);
});
// Sortie : Adresse : 93.184.216.34 Famille : 4 

### 3. Vérifier la disponibilité d'un port

 Utilisez le module net pour tester si un port est utilisé.

const net = require('net');
const server = net.createServer();
server.once('error', (err) => {
 if (err.code === 'EADDRINUSE') {
 console.log('Le port est déjà utilisé');
 }
});
server.once('listening', () => {
 console.log('Le port est libre');
 server.close();
});
server.listen(3000); 

### 4. Utiliser des outils externes

- netstat -tulpn pour lister les ports en écoute.

- lsof -i :3000 pour voir quel processus utilise un port.

- curl -v http://localhost:3000 pour tester la connectivité HTTP.

### 5. Surveiller l'activité réseau

 Utilisez tcpdump ou Wireshark pour capturer le trafic. Exemple :

sudo tcpdump -i any port 3000 -n 

## Modes de défaillance et récupération

 Comprendre les modes de défaillance courants aide à une récupération rapide.

### 1. Port déjà utilisé (EADDRINUSE)

Symptôme : L'application plante avec Error: listen EADDRINUSE .

Récupération : Trouvez le processus utilisant le port et tuez-le (si sûr) ou choisissez un autre port.

lsof -i :3000
# Sortie : COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# node 12345 user 18u IPv6 123456 0t0 TCP *:3000 (LISTEN)
kill 12345 

### 2. Échec de résolution DNS (ENOTFOUND)

 Symptôme : Error: getaddrinfo ENOTFOUND example.com

Récupération : Vérifiez la configuration DNS, essayez des serveurs DNS alternatifs ou vérifiez le nom de domaine.

### 3. Connexion refusée (ECONNREFUSED)

Symptôme : Error: connect ECONNREFUSED 127.0.0.1:3306

Récupération : Assurez-vous que le service cible est en cours d'exécution et en écoute sur le port attendu. Vérifiez les règles du pare-feu.

### 4. Délai d'attente dépassé (ETIMEDOUT)

Symptôme : La requête se bloque et finit par lancer Error: connect ETIMEDOUT .

Récupération : Enquêtez sur la latence du réseau, les règles du pare-feu bloquant le trafic, ou un serveur surchargé.

### 5. Erreurs de certificat

Symptôme : Error: unable to verify the first certificate lors de requêtes HTTPS.

Récupération : Assurez-vous que le certificat SSL est valide et non expiré. Pour les services internes, vous devrez peut-être fournir une autorité de certification personnalisée.

## Pièges courants et comment les éviter

### 1. Ignorer les variables d'environnement

De nombreux déploiements Node.js reposent sur des variables d'environnement pour les paramètres de proxy, les URL de base de données, etc. Oublier de les définir correctement peut causer des échecs mystérieux. Vérifiez toujours process.env dans votre application ou env dans le shell.

Exemple : Si votre application utilise process.env.DATABASE_URL mais qu'il est indéfini, les connexions échoueront. Définissez-le explicitement dans votre déploiement ou utilisez un fichier .env avec dotenv .

### 2. Coder en dur les adresses IP

Coder en dur les adresses IP dans le code rend l'application fragile. Préférez utiliser des noms d'hôtes et la résolution DNS. Si une IP change, il suffit de mettre à jour le DNS, pas de redéployer le code.

### 3. Ne pas gérer les délais d'attente des sockets

Les opérations réseau peuvent se bloquer indéfiniment si aucun délai n'est défini. Définissez toujours des délais raisonnables sur les sockets et les requêtes HTTP.

const http = require('http');
const request = http.get('http://example.com', (res) => {
 // gérer la réponse
});
request.setTimeout(5000, () => {
 request.destroy();
 console.error('Requête expirée');
}); 

### 4. Oublier de fermer les connexions

 Les connexions qui fuient peuvent épuiser les descripteurs de fichiers. Utilisez le regroupement de connexions et assurez-vous que les connexions sont libérées après utilisation. Pour les clients de base de données, utilisez le regroupement intégré.

### 5. Mauvais config des équilibreurs de charge ou des proxys inverses

Si votre application Node.js est derrière un proxy, assurez-vous que trust proxy est correctement défini dans Express pour obtenir la vraie IP du client.

app.set('trust proxy', 'loopback'); 

## Liste de vérification des opérations

 Utilisez cette liste pour dépanner systématiquement les problèmes réseau Node.js.

- Inventorier l'environnement

- Version de Node.js : node -v

- OS et interfaces réseau : uname -a , ip addr

- Configuration DNS : cat /etc/resolv.conf

- Reproduire le problème

- Exécutez l'application et capturez les journaux d'erreurs.

- Utilisez --trace-warnings ou --trace-deprecation pour plus de détails.

- Vérifier la disponibilité du port

- lsof -i :PORT ou netstat -tulpn | grep PORT

- Tester la connectivité

- ping host pour la joignabilité de base.

- curl -v http://host:port pour voir les détails HTTP.

- telnet host port pour tester la connexion TCP.

- Inspecter la résolution DNS

- nslookup domain ou dig domain

- Dans Node.js, utilisez dns.lookup avec un rappel pour voir s'il échoue.

- Examiner la configuration de l'application

- Vérifiez les variables d'environnement, les fichiers de configuration et les valeurs codées en dur.

- Recherchez les paramètres de proxy, les délais d'attente et les options SSL.

- Examiner les ressources système

- ulimit -n pour vérifier la limite des descripteurs de fichiers.

- ss -s pour voir les statistiques des sockets.

- Analyser les journaux

- Vérifiez les journaux d'application pour des erreurs comme ECONNREFUSED, ETIMEDOUT, etc.

- Utilisez journalctl -u your-service si vous utilisez systemd.

- Faire un changement à la fois

- Changez quelque chose, testez et observez. Si cela n'aide pas, revenez en arrière.

- Documenter les conclusions

- Notez ce qui a résolu le problème et mettez à jour les procédures.

## Conclusion

Le dépannage des problèmes réseau de Node.js nécessite une approche méthodique et une solide compréhension à la fois du runtime Node.js et de la pile réseau du système d'exploitation sous-jacent. En suivant les techniques décrites dans cet article, vous pouvez rapidement identifier et résoudre les problèmes courants tels que les échecs DNS, les conflits de ports et les erreurs de connectivité.

N'oubliez pas de toujours commencer par un inventaire de l'environnement, d'effectuer les modifications en toute sécurité, de vérifier vos corrections et d'avoir un plan de retour en arrière. Gardez les pièges courants à l'esprit pour éviter que les problèmes ne se reproduisent. Avec la pratique, vous deviendrez compétent pour diagnostiquer et corriger efficacement les problèmes réseau de Node.js.

Comme prochaine étape, choisissez une vérification à faible risque de cet article, exécutez-la dans votre environnement et voyez si les résultats correspondent aux attentes. Cette pratique pratique renforcera vos compétences en dépannage et vous préparera aux incidents du monde réel.