Acompanhamento de: Conexão de API via ipv6 vs. ipv4 - suporte - Discourse Meta
Recentemente atualizei o Node.js de 18 para 20 e minha aplicação de repente parou de receber respostas da API do Discourse. Levei um tempo para descobrir que estava relacionado ao problema acima. Verifiquei isso fazendo uma conexão apenas via IPv4 como:
import {Agent} from 'node:https'
import axios from 'axios'
import {env} from 'node:process'
export const axiosDiscourse = axios.create({
baseURL: 'https://<url-do-discourse>',
headers: {
'api-key': env['DISCOURSE_KEY'],
'api-username': env['DISCOURSE_USERNAME']
},
httpsAgent: new Agent({
family: 4
})
})
a parte importante sendo a especificação do Agente HTTP - eu estava usando sem isso antes. Isso agora funciona, mas eu estava tentando migrar do Axios, para que eu possa usar outras bibliotecas baseadas em fetch como Wretch (principalmente para reduzir o tamanho do pacote usando isso no frontend também): elbywan/wretch: A tiny wrapper built around fetch with an intuitive syntax.
(github.com). No entanto, não há opção para especificar IPv4 ou IPv6 com fetch. Assim, pensei que precisaria:
- Forçar o uso apenas de IPv4 de alguma forma e, apesar de todas as minhas tentativas até agora, isso não foi possível
- Verificar com o Discourse como eu poderia fazer isso funcionar no IPv6.
Estou me conectando a várias outras APIs da minha aplicação, nenhuma tem esse problema, é apenas a conexão com o Discourse que está falhando.
Este é o erro que estou recebendo, caso ajude:
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
}
O interessante é que, ao contrário do tópico mencionado acima, eu não recebo resposta após muito tempo. Minha solicitação falha imediatamente com este erro. A chamada da API funciona bem no navegador, curl e qualquer outra coisa que eu possa testar.
A minha forma de fazer uma solicitação à API não importa, desde que eu esteja fazendo uma solicitação da minha aplicação. Simplesmente falha e funciona apenas usando a opção de família, como mencionado acima. No tópico vinculado, vejo isso sendo mencionado:
Você precisará investigar por que as conexões IPv6 não funcionam em sua rede.
Tenho 2 preocupações com isso:
- Não sei como verificar especificamente isso.
- Não tenho certeza por que isso seria um problema apenas com o Discourse, e apenas com minha aplicação.
