Socket.io-client: يظهر خطأ استقصاء XHR عند وجود مصحح الأخطاء

تم إنشاؤها على ١٣ أبريل ٢٠١٧  ·  30تعليقات  ·  مصدر: socketio/socket.io-client

اتريد:

  • [x] أبلغ عن خطأ
  • [] طلب ميزة

السلوك الحالي

أواجه مشكلة في محاولة إنشاء اتصال بمقبس الويب على رد الفعل الأصلي. لست متأكدًا مما إذا كان هذا النظام الأساسي مدعومًا أم لا ، ومع ذلك ، يمكن تكرار هذا الخطأ في تطبيق node.js العادي. من الغريب أنني أواجه مشكلة فقط عندما يتم تعطيل مصحح الأخطاء المدمج في رد الفعل الأصلي. أقوم باختبار هذا على IOS 10.2 باستخدام react-native v0.43.1 و socket.io-client v1.7.3 . يعمل خادمي على تشغيل socket.io v1.7.2 مستضافًا على منفذ HTTP 1337.

خطوات إعادة الإنتاج (إذا كان السلوك الحالي خطأ)

بمجرد أن أقوم بتنفيذ socket.io-client في رد الفعل الأصلي ومحاولة الاتصال بدون تمكين مصحح الأخطاء ، يجب أن يعيد الإنتاج مع وجود خطأين بناءً على الخيارات. إذا لم أحدد خيار النقل الخاص بي ، فسيكون الخطأ XHR: POLLING ERROR . إذا قمت بتحديد "websocket" في خيار النقل الخاص بي ، فسيصبح الخطأ WEBSOCKET ERROR . هذا كل ما حصلت عليه.

سلوك متوقع

اتصال مقبس الويب العادي إلى الخادم الخاص بي. إنه يعمل مع تمكين المصحح.

يثبت

  • نظام التشغيل: OSX El Capitan 10.11.6
  • المتصفح: أعتقد أن التفاعل الأصلي يستخدم webkit ، لكني لست متأكدًا.
  • إصدار socket.io: المذكور أعلاه

معلومات أخرى (مثل stacktraces والمشكلات ذات الصلة واقتراحات كيفية الإصلاح)

كانت المشكلة الأخرى الوحيدة التي وجدتها متعلقة بهذه المشكلة هي # 1056 وأنا مندهش من مدى ارتباط هذه المشكلات بشكل غريب. لقد أعدت محاولة السيناريو على تطبيق node.js عادي وشهدت نتائج مماثلة ، ولكن الأخطاء كانت أكثر تفصيلاً كما هو موضح أدناه.

بدون خيار النقل المحدد:

{ Error: xhr poll error
    at XHR.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
    at Request.<anonymous> (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:129:10)
    at Request.Emitter.emit (/path/to/root/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:307:8)
    at Timeout._onTimeout (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:254:18)
    at ontimeout (timers.js:365:14)
    at tryOnTimeout (timers.js:237:5)
    at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }

مع transports: ['websocket'] :

{ Error: websocket error
    at WS.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
    at WebSocket.ws.onerror (/path/to/root/node_modules/engine.io-client/lib/transports/websocket.js:149:10)
    at WebSocket.onError (/path/to/root/node_modules/ws/lib/WebSocket.js:452:14)
    at emitOne (events.js:96:13)
    at WebSocket.emit (events.js:189:7)
    at ClientRequest.onerror (/path/to/root/node_modules/ws/lib/WebSocket.js:711:10)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:189:7)
    at TLSSocket.socketErrorListener (_http_client.js:358:9)
    at emitOne (events.js:96:13)
  type: 'TransportError',
  description: 
   { Error: socket hang up
       at TLSSocket.onHangUp (_tls_wrap.js:1117:19)
       at Object.onceWrapper (events.js:291:19)
       at emitNone (events.js:91:20)
       at TLSSocket.emit (events.js:186:7)
       at endReadableNT (_stream_readable.js:974:12)
       at _combinedTickCallback (internal/process/next_tick.js:74:11)
       at process._tickCallback (internal/process/next_tick.js:98:9)
     code: 'ECONNRESET',
     type: 'error',
     target: 
      WebSocket {
        domain: null,
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        _socket: null,
        _ultron: null,
        _closeReceived: false,
        bytesReceived: 0,
        readyState: 0,
        supports: [Object],
        extensions: {},
        _binaryType: 'nodebuffer',
        _isServer: false,
        url: 'wss://SERVER_IP:1337/socket.io/?EIO=3&transport=websocket',
        protocolVersion: 13 } } }

ضع في اعتبارك أيضًا أن عميل socket.io القائم على المستعرض يعمل على الاتصال بخادم الويب المحدد هذا بشكل لا تشوبه شائبة.

لقد جربت العديد من الشبكات المختلفة ، ومزودي خدمة الإنترنت ، وحتى شبكات VPN. أنا جاهل في هذه المرحلة.

التعليق الأكثر فائدة

لقد قمت بحل مشكلتي منذ أسبوع عن طريق إعادة بناء ديون ولكن لا أتذكر ما حل المشكلة بالضبط. آسف لذلك ، كان لدي أسبوع حافل وكان هذا هو الالتزام الأولي.

يمكنك محاولة تعيين opts.transports على websocket في العميل:

io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']

كان لدي مأخذ معقد للغاية ومنطق ربط الإجراء قبل إعادة تشكيل الكود. لذا تأكد من عمل منطق مأخذ التوصيل في التعليمات البرمجية الخاصة بك واجعل تصحيح الأخطاء أسهل.

ال 30 كومينتر

تحديث : بعد اختبار أحد تطبيقاتي على iPhone الخاص بي باستخدام socket.io-client ، كنت محظوظًا لأنني لم أجد خطأ استطلاع XHR. ومع ذلك ، ما زلت أواجه هذا الخطأ في تطبيق عقدة عادي.

أواجه حاليًا نفس المشكلة مع تطبيق العقدة الخاص بي أيضًا. أستخدم خادم socket.io المدمج ويبدو أنه يعمل بشكل جيد في المتصفح ولكن في تطبيق العقدة socket.io-client يلقي نفس خطأ الاستطلاع 503 xhr أعلاه. أنا أقوم بتشغيل الخادم والعميل على نفس الجهاز ولكن الاتصال باسترجاع أو عنوان الشبكة المحلية من تطبيق العميل لا يعمل. أنا أستخدم الإصدار 1.7.3 لكلٍّ من socket.io و socket.io-client .

أرى أيضًا هذا الخطأ في الإصدار 2.0.1 (العميل والخادم) عند التشغيل من العقدة.

لقد قمت بحل مشكلتي منذ أسبوع عن طريق إعادة بناء ديون ولكن لا أتذكر ما حل المشكلة بالضبط. آسف لذلك ، كان لدي أسبوع حافل وكان هذا هو الالتزام الأولي.

يمكنك محاولة تعيين opts.transports على websocket في العميل:

io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']

كان لدي مأخذ معقد للغاية ومنطق ربط الإجراء قبل إعادة تشكيل الكود. لذا تأكد من عمل منطق مأخذ التوصيل في التعليمات البرمجية الخاصة بك واجعل تصحيح الأخطاء أسهل.

سأحاول نقل. في الوقت الحالي ، خفضت تصنيفي إلى 1.7.4 ويبدو أن كل شيء يعمل.

نعم ، قمت بتخفيض الإصدار من 2.0.1 إلى 1.7.4 لإصلاح ذلك

لذلك قمت بالترقية مرة أخرى إلى 2.0.1 وقمت بإعداد عميلي لاستخدام نقل websocket فقط. يعمل (تقريبًا):

io(`localhost:8080`, {
    transports: [ 'websocket' ],
    upgrade: false
});

الآن مشكلتي الوحيدة هي أن نقل websocket معطل لنطاقات عمال الويب. أعتقد أنني حددت المشكلة وفتحت مشكلة مقابلة على engine.io-client هنا https://github.com/socketio/engine.io-client/issues/569

هل حدث أي خطأ؟ هل يمكنك تشغيل مع تمكين التصحيح؟ ( DEBUG=engine* )

فيما يتعلق برد الفعل الأصلي ، قد يكون مرتبطًا بـ https://github.com/socketio/socket.io-client/issues/1114.

darrachequesne لذا عدت للتو إلى وسائل النقل الافتراضية على مكون العميل من جانب الخادم. خطأي هناك ... نقل الاقتراع يعمل بالتأكيد بالنسبة لي. كانت المشكلة التي واجهتها تتعلق بشهادات SSL الموقعة ذاتيًا الخاصة بالتطوير المحلي. اضطررت إلى إضافة rejectUnauthorized: process.env.NODE_ENV === 'production' إلى التكوين socket.io لجعله يعمل. كنت أحصل على 503 خلاف ذلك.

مشكلة عامل الويب حقيقية بالرغم من ذلك. socketio / engine.io-client # 569

جرب هذا

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

شكرا سأحاول ذلك
----- الرسالة الاصلية -----
من: Zetsin [email protected]
المستلم: "socketio / socket.io-client" [email protected]
نسخة إلى: Wangzhiqiang [email protected] ، تعليق تعليق @noreply.github.com
الموضوع: Re: [socketio / socket.io-client] يظهر خطأ استطلاع XHR عند وجود مصحح الأخطاء (# 1097)
التاريخ: 16:22 ، 20 مايو 2017

جرب هذا
تتطلب ('socket.io-client') ('http: // localhost'، {
رفض غير مصرح به: خطأ ،
})

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو اعرضها على GitHub ، أو قم بكتم صوت الموضوع.

لدي نفس المشكلة. ثم أقوم بتغيير رمز العميل الخاص بي إلى

require('socket.io-client')('wss://myserver:port/ws', { transports: ['websocket'], rejectUnauthorized: false });

ولكن الآن ، أحصل على استجابة خطأ 404. يُظهر السجل أنه تمت إضافة /socket.io/ إضافي إلى عنوان url لطلبي.

 { Error: unexpected server response (404)
       at ClientRequest._req.on (/Users/chris/Projects/nationsky/mgmt-server/backend/node_modules/ws/lib/WebSocket.js:650:26)
       at emitOne (events.js:115:13)
       at ClientRequest.emit (events.js:210:7)
       at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:564:21)
       at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
       at TLSSocket.socketOnData (_http_client.js:453:20)
       at emitOne (events.js:115:13)
       at TLSSocket.emit (events.js:210:7)
       at addChunk (_stream_readable.js:252:12)
       at readableAddChunk (_stream_readable.js:239:11)
     type: 'error',
     target:
      WebSocket {
        domain: null,
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        readyState: 0,
        bytesReceived: 0,
        extensions: {},
        protocol: '',
        _binaryType: 'arraybuffer',
        _finalize: [Function: bound finalize],
        _finalizeCalled: false,
        _closeMessage: null,
        _closeTimer: null,
        _closeCode: null,
        _receiver: null,
        _sender: null,
        _socket: null,
        _ultron: null,
        protocolVersion: 13,
        _isServer: false,
        url: 'wss://myserver:port/socket.io/?access_token=HnbtDUEWu1i1HVrAn-DO9YOL6GZxoittWAf8Sz_RR0s&EIO=3&transport=websocket',
        _req: [Object] } } }

بالنسبة لي يبدو حتى لو كان المصحح غير موجود

مرحبا! واجهت نفس المشكلة أثناء محاولتي الاتصال من تطبيق Node.js بالخادم ، إليك الكود الخاص بي:

const socket = require('socket.io-client')('https://domain.com')

السجل الذي قمت بتشغيله DEBUG=engine* npm run dev كان كالتالي:

asciicast

engine.io-client:socket creating transport "polling" +2s
engine.io-client:polling polling +1ms
engine.io-client:polling-xhr xhr poll +0ms
engine.io-client:polling-xhr xhr open GET: https://domain.com/socket.io/?EIO=3&transport=polling&t=LzBM71r&b64=1 +0ms
engine.io-client:polling-xhr xhr data null +0ms
engine.io-client:socket setting transport polling +1ms
engine.io-client:socket socket error {"type":"TransportError","description":503} +7ms
engine.io-client:socket socket close with reason: "transport error" +0ms
engine.io-client:polling transport not open - deferring close +0ms

عندما حاولت الاتصال من المتصفح بـ https://domain.com/socket.io/socket.io.js ، نجح الأمر وباستخدام io('https://domain.com') أيضًا ، لذلك اتبعت التعليمات الواردة في التعليقات وقمت بتغيير الكود الخاص بي إلى:

const socket = require('socket.io-client')('https://domain.com', { rejectUnauthorized: false })

وقد نجح الأمر ، لكنه غريب ، لدي شهادات صالحة من Let's Encrypt ، أم أنه طبيعي؟ على أي حال .. لقد أضفت الخيار transports (من التعليقات أيضًا) لتجنب الاتصالات الأخرى غير websocket وفي النهاية كان الرمز:

const socket = require('socket.io-client')('https://domain.com', {
  transports: ['websocket'],
  rejectUnauthorized: false
})

شكرا ابراهيم دوران و SupremeTechnopriest : ابتسم:

اعتذاري إذا كتبت مثل طرزان: sweat_smile: أنا أعمل على لغتي الإنجليزية هههه

لقد واجهت هذه المشكلة وقضيت ساعتين في هذا الأمر ، اتضح أنه مجرد تحديد خياراتك بشكل صحيح. إليك كيفية تحديدها:

   let socketClient = socketIOClient.connect(`http://localhost:3001`,{ // [1] Important as fuck 
      reconnectionDelay: 1000,
      reconnection:true,
      reconnectionAttempts: 10,
      transports: ['websocket'],
      agent: false, // [2] Please don't set this to true
      upgrade: false,
      rejectUnauthorized: false
   });

[1] إذا لم تحدد ما إذا كنت تريد استخدام http أو https ، فسيتم تعيينه افتراضيًا على https. أو إذا لم تحدد المنفذ مباشرة بعد عنوان url كـ "url. com: port " ، يتم تعيينه افتراضيًا على 80 أو 443 اعتمادًا على البروتوكول. لقد رأيت بعض إجابات stackoverflow التي تحتوي على منفذ محدد كخيار في كائن الخيارات. لقد بحثت في الكود ولا يوجد مثل هذا الخيار. تحتاج إلى تضمين المنفذ في عنوان url.

[2] وأيضًا ، قمت بضبط الوكيل على true وفشل في إنشاء اتصال ws ولم يكن هناك خطأ ، لقد انقضت مهلته ببساطة. فقط لا تحدد الوكيل على الإطلاق. انها افتراضية على خطأ.

@ teja42 حاولت إصلاح هذه المشكلة لمدة يومين. اعتقدت أنها كانت مشكلة تجميع مع webpack ولكن الحل الخاص بك يعمل بشكل رائع. شكرا!

مرحبا !

لقد واجهت نفس المشكلة وقمت بإصلاح التخفيض من 2.0.1 إلى 1.7.4 كما قال SupremeTechnopriest وكل ذلك يعمل بشكل جيد!

شكرا !

مرحبًا ، ما زلت أواجه هذه المشكلة أثناء المحاولة على Android 8.1 :(

كود مزيف:
""
this.socket = io.connect ('https: // xxxxxxxxxxxxxx'، {
المسار: '/ socketchannel'،
التأخير: 1000 ،
إعادة الاتصال: صحيح ،
المحاولات: 10 ،
النقل: ['websocket'] ،
الوكيل: خطأ ،
ترقية: خطأ ،
رفض غير مصرح به: خطأ
}) ؛

this.socket.on ('connect'، () => {
console.log ('المقبس متصل!')
})
this.socket.on ('connect_error'، (يخطئ) => {
console.log ('socket connect error ->' + err) ؛
})

""
ينتقل التطبيق إلى حدث "connection_error" ويسجل "خطأ: خطأ websocket"

"تفاعل أصلي": "0.57.4"،
"socket.io-client": "1.7.4"

أي اقتراحات؟

ينتقل التطبيق إلى حدث "connection_error" ويسجل "خطأ: خطأ websocket"

تواجه نفس المشكلة

    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
    "engine.io-client": "~3.3.2",
    "socket.io-client": "2.1.1",

أواجه نفس المشكلة أي تحديث على ذلك؟

+1 لذلك

واجهت هذه المشكلة بسبب origins لخادم المقبس.
فكيف نضيف الأصول الآن؟

أهلا بكم. لذلك أنا أستخدم كتلة PM2 لخادم node Express الخاص بي وباستخدام محول redis:

const redis = require('socket.io-redis') 
io.adapter(redis(config.redis))

بالنسبة لعملاء المتصفح ، يبدو هذا جيدًا ، لكن بالنسبة إلى socket.io-client ، أحصل على:

{ Error: xhr post error
    at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
    at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:111:10)
    at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
    at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
    at listOnTimeout (timers.js:327:15)
    at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
{ Error: xhr poll error
    at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
    at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:130:10)
    at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
    at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
    at listOnTimeout (timers.js:327:15)
    at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }

إذا قمت بتغيير كود العميل لاستخدام websocket ، فكل ذلك يعمل بشكل جيد.

var socket = require("socket.io-client")("http://localhost:8080", { transports: ['websocket'] });

المشكلة هي أنني لا أريد طلب تغيير هذا الرمز لجميع رموز العميل.

توصيتي بتغيير socket.io-client لمحاولة نقل websocket إذا فشل نقل استقصاء xhr. ما رأيك؟

جرب الإصدار الأخير من جيثب ، مثل هذا ، حل مشاكلي مع RN android:

npm i socketio/engine.io-client#3.3.2 -S

هتافات

أعلم أن هذا الحل سيبدو غريبًا بعض الشيء ، لكنني وصلت إلى هنا من خلال البحث في Google عن هذا الخطأ.

في حالتي ، كنت أحصل على هذا لأن خادمي لم يكن قيد التشغيل (اعتقدت أنه كان كذلك). على أمل أن يساعد شخص آخر :)

جرب هذا

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

شكرًا ، كنت أواجه مشكلات في الاتصال بخادمي من تطبيق عقدة ، وكان هذا الحل يعمل جيدًا بالنسبة لي.

جرب هذا

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

شكرًا ، كنت أواجه مشكلات في الاتصال بخادمي من تطبيق عقدة ، وكان هذا الحل يعمل جيدًا بالنسبة لي.
مرحبًا ، لقد تساءلت للتو عن إصدار socket.io و socket.io-client الذي تستخدمه

جرب هذا

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

شكرًا ، كنت أواجه مشكلات في الاتصال بخادمي من تطبيق عقدة ، وكان هذا الحل يعمل جيدًا بالنسبة لي.
مرحبًا ، لقد تساءلت للتو عن إصدار socket.io و socket.io-client الذي تستخدمه

أنا أستخدم كل من socket.io و socket.io-client في الإصدار 2.3.0.

مرحبًا ، ما زلت أواجه هذه المشكلة أثناء المحاولة على Android 8.1 :(

كود مزيف:

this.socket = io.connect('https://xxxxxxxxxxxxxx', { 
     path: '/socketchannel', 
     reconnectionDelay: 1000,
     reconnection:true,
     reconnectionAttempts: 10,
     transports: ['websocket'],
     agent: false, 
     upgrade: false,
     rejectUnauthorized: false
   });

this.socket.on('connect', () => {
     console.log('socket connected!')
   })
this.socket.on('connect_error', (err) => {
     console.log('socket connected error --> ' + err);
   })

ينتقل التطبيق إلى حدث "connection_error" ويسجل "خطأ: خطأ websocket"

"تفاعل أصلي": "0.57.4"،
"socket.io-client": "1.7.4"

أي اقتراحات؟

نفس المشكلة ، هل قمت بحلها؟

أقوم بحل مشكلتي باستخدام اسم المجال.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات