Seguito di: API connection via ipv6 vs. ipv4 - support - Discourse Meta
Recentemente ho aggiornato Node.js da 18 a 20 e la mia applicazione ha improvvisamente smesso di ricevere risposte API da Discourse. Mi ci è voluto un po’ per capire che era correlato al problema sopra menzionato. L’ho verificato effettuando una connessione solo tramite IPv4 come:
import {Agent} from 'node:https'
import axios from 'axios'
import {env} from 'node:process'
export const axiosDiscourse = axios.create({
baseURL: 'https://<discourse-url>',
headers: {
'api-key': env['DISCOURSE_KEY'],
'api-username': env['DISCOURSE_USERNAME']
},
httpsAgent: new Agent({
family: 4
})
})
la parte importante è specificare l’agente HTTP: prima lo usavo senza. Questo ora funziona, ma stavo tentando di migrare da Axios, in modo da poter utilizzare altre librerie basate su fetch come Wretch (principalmente per ridurre le dimensioni del bundle utilizzandolo anche nel frontend): elbywan/wretch: A tiny wrapper built around fetch with an intuitive syntax.
(github.com). Tuttavia, non c’è opzione per specificare IPv4 o IPv6 con fetch. Pertanto, ho pensato che dovessi:
- Forzare l’uso solo di IPv4 in qualche modo e nonostante tutti i miei tentativi finora, questo non è stato possibile.
- Verificare con Discourse come potrei far funzionare questo su IPv6.
Sto connettendomi a varie altre API dalla mia applicazione, nessuna ha questo problema, è solo la connessione con Discourse che fallisce.
Questo è l’errore che sto ricevendo nel caso possa aiutare:
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
}
Ciò che è interessante è che, a differenza del thread menzionato sopra, non ricevo risposta dopo molto tempo. La mia richiesta fallisce immediatamente con questo errore. La chiamata API funziona bene nel browser, curl e qualsiasi altra cosa che posso testare.
Il mio modo di effettuare una richiesta all’API non ha importanza finché effettuo una richiesta dalla mia applicazione. Semplicemente fallisce e funziona solo utilizzando l’opzione family come menzionato sopra. Nel thread collegato, vedo questo menzionato:
Dovrai indagare sul perché le connessioni IPv6 non funzionano sulla tua rete.
Ho 2 preoccupazioni riguardo a questo:
- Non so come verificarlo specificamente.
- Non sono sicuro del perché questo dovrebbe essere un problema solo con Discourse, e solo con la mia applicazione.
