Socket.io-client: خطأ في مساحة الاسم غير صالح (فقط على Linux Ubuntu)

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

لدي برنامج نصي NodeJS مخصص للتشغيل على جهاز ، وتطبيق على الخادم. أريد توصيل الجهاز بمساحة الاسم /device على الخادم. هذا يعمل بشكل مثالي على Windows. في Ubuntu ، لا يتصل الجهاز أبدًا. يعطي تمرير متغير env في DEBUG هذا الناتج:

socket.io-client:url parse http://localhost:3000/device +0ms
  socket.io-client new io instance for http://localhost:3000/device +7ms
  socket.io-client:manager readyState closed +5ms
  socket.io-client:manager opening http://localhost:3000/device +0ms
  engine.io-client:socket creating transport "websocket" +3ms
  engine.io-client:socket setting transport websocket +47ms
  socket.io-client:manager connect attempt will timeout after 20000 +2ms
  socket.io-client:manager readyState opening +4ms
  engine.io-client:socket socket receive: type "open", data "{"sid":"oYxMG7iQuy2Rp7LWAAAN","upgrades":[],"pingInterval":25000,"pingTimeout":60000}" +51ms
  engine.io-client:socket socket open +1ms
  socket.io-client:manager open +1ms
  socket.io-client:manager cleanup +1ms
  socket.io-client:socket transport is open - connecting +1ms
  socket.io-client:manager writing packet {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device"} +1ms
  socket.io-parser encoding packet {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device?deviceId=123456789abcdef"} +0ms
  socket.io-parser encoded {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device?deviceId=123456789abcdef"} as 0/device?deviceId=123456789abcdef +1ms
  engine.io-client:socket flushing 1 packets in socket +1ms
  engine.io-client:socket socket receive: type "message", data "0" +14ms
  socket.io-parser decoded 0 as {"type":0,"nsp":"/"} +2ms
  engine.io-client:socket socket receive: type "message", data "4/device?deviceId=123456789abcdef,"Invalid namespace"" +3ms
  socket.io-parser decoded 4/device?deviceId=123456789abcdef,"Invalid namespace" as {"type":4,"nsp":"/device?deviceId=123456789abcdef","data":"Invalid namespace"} +2ms

أي يبدو أن مساحة الاسم غير صالحة. ليس لدي أي فكرة عن السبب ، حيث يعمل هذا الرمز بشكل مثالي على Windows.
رمز جهازي (العميل):

const socket = io.connect('http://localhost:3000/device', {
    transports: ['websocket'],
    secure: true,
    query: { deviceId: '123456789abcdef' }
});

socket.on('connect', function() {
    console.log('Connection to server established');
})

رمز الخادم الخاص بي:

  const device = io.of('/device'),
      portal = io.of('/portal');

  device.on('connection', function(socket) {
      console.log('Connection made');
  })

أي أفكار ستكون مفيدة.

Unable to reproduce

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

أنا أستخدم 1.7.3 ولا يزال الخطأ موجودًا. ساعد الرجوع إلى الإصدار 1.4.8 ، ولكن يبدو أن الوظيفة emit تعمل بشكل مختلف. هل هناك أي تقدم في إصلاح هذا في 1.7.3؟

ال 16 كومينتر

لقد لاحظت هذا أيضًا في الإصدار 1.5.0 socket.io-client . يبدو أنه لسبب ما يتم إلحاق قيمة opts.query باسم مساحات الأسماء ، مما يتسبب في ظهور خطأ "مساحة الاسم غير صالحة".

مثال:

io.connect("/hello", {
  query: "foo=bar"
})

يجب أن يتصل بمساحة الاسم /hello ولكن بدلاً من ذلك يحاول الاتصال بمساحة الاسم /hello?foo=bar .

لقد اختبرت ذلك في 1.4.8 ولا يوجد خطأ ، لذلك تم تقديم هذا الخطأ في مكان ما بعد ذلك. (لا أعتقد أيضًا أن هذا الخطأ مرتبط بـ Ubuntu على وجه التحديد لأنني يمكنني إعادة إنتاجه على Win7 و Mint Rosa.)

آه حسنًا ، هذا منطقي. جلالة الملك. هل لديك أي أفكار للعلاج ، أو أين يجب أن أبحث في الريبو إذا كنت أرغب في إصلاح هذا؟

لا توجد فكرة عن كيفية إصلاح هذا ، ولكن يمكنك الرجوع إلى [email protected] حيث لا يوجد هذا الخطأ ، هذا ما فعلته على أي حال.

قد يكون ذلك مرتبطًا بـ https://github.com/socketio/socket.io-client/pull/943 (و https://github.com/socketio/socket.io/pull/2422)

لقد اختبرت ذلك على v1.4.8 وعمل كما هو متوقع. ثم اختبرته مع v1.5 على العميل فقط وتوقف عن العمل. ومع ذلك ، أدى تثبيت الإصدار 1.5 على الخادم _ والعميل إلى إصلاح المشكلة.

لذلك يبدو أن الخطأ يحدث فقط عندما يكون هناك عدم تطابق في الإصدار بين العميل والخادم ، ولكن ليس عندما يكون لكلاهما نفس الإصدار ، سواء كان ذلك أعلى أو أقل من الإصدار 1.5.

@ Arrow7000 هل يمكنك التحقق مما إذا كان الإصدار 1.6.0 يصلح مشكلتك؟

ما زلت أواجه هذه المشكلة مع الإصدار 1.7.2

stgogm هل تستخدم 1.7.2 على كل من العميل والخادم؟ هل هذه نفس المشكلة بالضبط؟

darrachequesne نعم ، أنا كذلك. والخطأ هو نفسه: يحاول الاتصال بـ /namespace?q=value ، على سبيل المثال ، بدلاً من الاتصال بـ /namespace وتمرير q كمعلمة استعلام.

stgogm هل يمكنك تقديم حالة اختبار فاشلة؟ لا يمكنني إعادة الإنتاج: https://github.com/darrachequesne/socket.io-fiddle/tree/issue/invalid-namespace

darrachequesne على نحو فعال ،

أواجه نفس المشكلة ، حيث يعمل في إصدار العميل 1.4.8 ولكنه فشل في 1.5.1. (أنا أقوم بتشغيل إصدار خادم socket.io أقدم) هل هذا يعني أن إصدار العميل والخادم من socket.io يجب أن يتطابق دائمًا؟ هل هذا مذكور في مكان ما؟

أنا أستخدم 1.7.3 ولا يزال الخطأ موجودًا. ساعد الرجوع إلى الإصدار 1.4.8 ، ولكن يبدو أن الوظيفة emit تعمل بشكل مختلف. هل هناك أي تقدم في إصلاح هذا في 1.7.3؟

فقط صادفت شيئًا مشابهًا لهذا .. ولكن بدون سلاسل الاستعلام. أنا ببساطة أتصل بـ io([path]) w / path === "activities" .

لدي عرض في تطبيقي ينشئ مآخذ بأسماء اثنين ، "/ زيارات" و "/ أنشطة" ... يتصل مقبس "/ زيارات" بشكل جيد. أرى رسالة "مساحة الاسم غير صالحة" عند محاولة الاتصال بمساحة الاسم "/ الأنشطة".

لست متأكدًا من سبب قيامه بذلك. أنا أتبع نفس النمط لوجهة نظر أخرى تستخدم "/ منازل" و "/ زيارات" وقد تم إنشاء كلا المقابس بشكل جيد في هذا العرض.

RavenHursT هل تم إنشاء مساحة الاسم activities بشكل صحيح؟ (مع io.of('/activities'); )؟ هل يمكنك إعادة إنتاج المشكلة مع الكمان هنا؟

نعم ... ماه سيء ​​.. لقد نسيت إضافة جانب خادم مساحة الاسم ونسيت التحديث هنا. ارجوك ارفض :-/

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