Suivi de : Connexion API via IPv6 vs. IPv4 - support - Discourse Meta
J’ai récemment mis à niveau Node.js de 18 à 20 et mon application a soudainement cessé de recevoir de réponses API de Discourse. Il m’a fallu un certain temps pour comprendre que cela était lié au problème mentionné ci-dessus. J’ai vérifié cela en établissant une connexion uniquement via IPv4, comme ceci :
import {Agent} from 'node:https'
import axios from 'axios'
import {env} from 'node:process'
export const axiosDiscourse = axios.create({
baseURL: 'https://<url-discourse>',
headers: {
'api-key': env['DISCOURSE_KEY'],
'api-username': env['DISCOURSE_USERNAME']
},
httpsAgent: new Agent({
family: 4
})
})
La partie importante étant la spécification de l’agent HTTP - je l’utilisais sans cela auparavant. Cela fonctionne maintenant, mais j’essayais de migrer hors d’Axios, afin de pouvoir utiliser d’autres bibliothèques basées sur fetch comme Wretch (principalement pour réduire la taille du bundle en l’utilisant également sur le frontend) : elbywan/wretch: A tiny wrapper built around fetch with an intuitive syntax.
(github.com). Cependant, il n’y a pas d’option pour spécifier IPv4 ou IPv6 avec fetch. Ainsi, j’ai pensé que je devais soit :
- Forcer l’utilisation d’IPv4 uniquement d’une manière ou d’une autre et malgré toutes mes tentatives jusqu’à présent, cela n’a pas été possible.
- Vérifier avec Discourse comment je pourrais faire fonctionner cela sur IPv6.
Je me connecte à diverses autres API depuis mon application, aucune n’a ce problème, seule la connexion avec Discourse échoue.
Voici l’erreur que je reçois, au cas où cela aiderait :
Error: connect ETIMEDOUT 184.105.99.43:443
at createConnectionError (node:net:1634:14)
at Timeout.internalConnectMultipleTimeout (node:net:1685:38)
at listOnTimeout (node:internal/timers:575:11)
at processTimers (node:internal/timers:514:7) {
errno: -110,
code: 'ETIMEDOUT',
syscall: 'connect',
address: '184.105.99.43',
port: 443
},
Error: connect ENETUNREACH 2602:fd3f:3:ff01::2b:443 - Local (:::0)
at internalConnectMultiple (node:net:1176:40)
at Timeout.internalConnectMultipleTimeout (node:net:1687:3)
at listOnTimeout (node:internal/timers:575:11)
at processTimers (node:internal/timers:514:7) {
errno: -101,
code: 'ENETUNREACH',
syscall: 'connect',
address: '2602:fd3f:3:ff01::2b',
port: 443
}
Ce qui est intéressant, c’est que, contrairement au fil de discussion mentionné ci-dessus, je n’obtiens pas de réponse après un long moment. Mon appel échoue immédiatement avec cette erreur. L’appel API fonctionne bien dans le navigateur, curl et tout autre outil que je peux tester.
Ma façon de faire une requête à l’API n’a pas d’importance tant que je fais une requête depuis mon application. Cela échoue simplement et ne fonctionne qu’en utilisant l’option family mentionnée ci-dessus. Dans le fil de discussion lié, je vois ceci mentionné :
Vous devrez enquêter sur la raison pour laquelle les connexions IPv6 ne fonctionnent pas sur votre réseau.
J’ai 2 préoccupations à ce sujet :
- Je ne sais pas comment vérifier cela spécifiquement.
- Je ne suis pas sûr pourquoi ce serait un problème uniquement avec Discourse, et uniquement avec mon application.
