Seguimiento de: Conexión API vía ipv6 vs. ipv4 - support - Discourse Meta
Recientemente actualicé Node.js de 18 a 20 y mi aplicación de repente dejó de recibir respuestas de la API de Discourse. Me tomó un tiempo darme cuenta de que estaba relacionado con el problema anterior. Lo verifiqué haciendo una conexión solo a través de IPv4, como:
import {Agent} from 'node:https'
import axios from 'axios'
import {env} from 'node:process'
export const axiosDiscourse = axios.create({
baseURL: 'https://<url-de-discourse>',
headers: {
'api-key': env['DISCOURSE_KEY'],
'api-username': env['DISCOURSE_USERNAME']
},
httpsAgent: new Agent({
family: 4
})
})
la parte importante es especificar el Agente HTTP; lo estaba usando sin eso antes. Esto ahora funciona, pero estaba intentando migrar de Axios para poder usar otras bibliotecas basadas en fetch como Wretch (principalmente para reducir el tamaño del paquete usándolo también en el frontend): elbywan/wretch: A tiny wrapper built around fetch with an intuitive syntax.
(github.com). Sin embargo, no hay opción para especificar IPv4 o IPv6 con fetch. Por lo tanto, pensé que necesitaba:
- Forzar el uso solo de IPv4 de alguna manera y, a pesar de todos mis intentos hasta ahora, esto no ha sido posible.
- Consultar con Discourse sobre cómo podría hacer que esto funcione en IPv6.
Estoy conectándome a varias otras APIs desde mi aplicación, ninguna tiene este problema, solo la conexión con Discourse está fallando.
Este es el error que estoy recibiendo en caso de que ayude:
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
}
Lo interesante es que, a diferencia del hilo mencionado anteriormente, no obtengo respuesta después de mucho tiempo. Mi solicitud falla inmediatamente con este error. La llamada a la API funciona bien en el navegador, curl y cualquier otra cosa que pueda probar.
Mi forma de hacer una solicitud a la API no importa siempre que esté haciendo una solicitud desde mi aplicación. Simplemente falla y solo funciona usando la opción family como se mencionó anteriormente. En el hilo enlazado, veo que se menciona esto:
Tendrás que investigar por qué las conexiones IPv6 no funcionan en tu red.
Tengo 2 preocupaciones con eso:
- No sé cómo verificar eso específicamente.
- No estoy seguro de por qué este sería un problema solo con Discourse y solo con mi aplicación.
