متابعة لـ: API connection via ipv6 vs. ipv4 - support - Discourse Meta
لقد قمت مؤخرًا بترقية Node.js من 18 إلى 20 وتوقف تطبيقي فجأة عن تلقي استجابة API من Discourse. استغرق الأمر مني بعض الوقت لمعرفة أنه كان مرتبطًا بالمشكلة المذكورة أعلاه. لقد تحققّت من ذلك عن طريق إجراء اتصال عبر IPv4 فقط مثل:
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
})
})
الجزء المهم هو تحديد وكيل HTTP - كنت أستخدمه بدونه من قبل. هذا يعمل الآن، لكنني كنت أحاول التخلي عن Axios، حتى أتمكن من استخدام مكتبات أخرى تعتمد على fetch مثل Wretch (بشكل أساسي لتقليل حجم الحزمة عن طريق استخدامها في الواجهة الأمامية أيضًا): elbywan/wretch: A tiny wrapper built around fetch with an intuitive syntax.
(github.com). ومع ذلك، لا يوجد خيار لتحديد IPv4 أو IPv6 باستخدام fetch. وبالتالي، توصلت إلى أنني بحاجة إما إلى:
- فرض استخدام IPv4 فقط بطريقة ما وعلى الرغم من كل محاولاتي حتى الآن، لم يكن هذا ممكنًا
- التحقق مع Discourse حول كيفية الحصول على هذا العمل على IPv6.
أنا أتصل بواجهات برمجة تطبيقات أخرى مختلفة من تطبيقي، ولا تواجه أي منها هذه المشكلة، إنها فقط الاتصال بـ Discourse هو الذي يفشل.
هذا هو الخطأ الذي أحصل عليه في حال كان مفيدًا:
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
}
المثير للاهتمام هو أنه على عكس الموضوع المذكور أعلاه، لا أحصل على استجابة بعد فترة طويلة. يفشل طلبي على الفور مع هذا الخطأ. يعمل استدعاء API بشكل جيد في المتصفح و curl وأي شيء آخر يمكنني اختباره.
لا يهم طريقتي في إجراء طلب إلى API طالما أنني أجري طلبًا من تطبيقي. إنه يفشل ببساطة ويعمل فقط باستخدام خيار العائلة كما هو مذكور أعلاه. في الموضوع المرتبط، أرى هذا مذكورًا:
ستحتاج إلى التحقيق في سبب عدم عمل اتصالات IPv6 على شبكتك.
لديّ قلقان بشأن ذلك:
- لا أعرف كيف أتحقق من ذلك على وجه التحديد.
- لست متأكدًا لماذا ستكون هذه مشكلة فقط مع Discourse، وفقط مع تطبيقي.
