Nachverfolgung von: API-Verbindung über IPv6 vs. IPv4 - Support - Discourse Meta
Ich habe kürzlich Node.js von 18 auf 20 aktualisiert und meine Anwendung erhielt plötzlich keine API-Antwort mehr von Discourse. Es dauerte eine Weile, bis ich herausfand, dass es mit dem oben genannten Problem zusammenhing. Ich habe dies verifiziert, indem ich eine Verbindung nur über IPv4 hergestellt habe, wie zum Beispiel:
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
})
})
Der wichtige Teil ist die Angabe des HTTP-Agents – ich habe ihn vorher ohne verwendet. Das funktioniert jetzt, aber ich habe versucht, von Axios wegzukommen, damit ich andere fetch-basierte Bibliotheken wie Wretch verwenden kann (hauptsächlich, um die Bundle-Größe zu reduzieren, indem ich diese auch im Frontend verwende): elbywan/wretch: A tiny wrapper built around fetch with an intuitive syntax.
(github.com). Allerdings gibt es keine Option, IPv4 oder IPv6 mit fetch anzugeben. Daher habe ich festgestellt, dass ich entweder:
- Erzwingen muss, nur IPv4 zu verwenden, und trotz all meiner bisherigen Versuche war dies nicht möglich.
- Mit Discourse prüfen muss, wie ich dies mit IPv6 zum Laufen bringen kann.
Ich verbinde mich von meiner Anwendung aus mit verschiedenen anderen APIs, keine davon hat dieses Problem, nur die Verbindung mit Discourse schlägt fehl.
Dies ist die Fehlermeldung, die ich erhalte, falls sie hilfreich ist:
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
}
Interessanterweise erhalte ich, im Gegensatz zum oben genannten Thread, keine Antwort nach langer Zeit. Mein Aufruf schlägt sofort mit dieser Fehlermeldung fehl. Der API-Aufruf funktioniert im Browser, mit curl und allem anderen, was ich testen kann.
Die Art und Weise, wie ich eine Anfrage an die API stelle, spielt keine Rolle, solange ich eine Anfrage aus meiner Anwendung stelle. Sie schlägt einfach fehl und funktioniert nur durch die Verwendung der oben genannten Familienoption. Im verlinkten Thread sehe ich Folgendes erwähnt:
Sie müssen untersuchen, warum IPv6-Verbindungen in Ihrem Netzwerk nicht funktionieren.
Ich habe damit 2 Bedenken:
- Ich weiß nicht, wie ich das speziell überprüfen kann.
- Ich bin mir nicht sicher, warum dies nur mit Discourse und nur mit meiner Anwendung ein Problem sein sollte.
