Socket.io-client: 無効な名前空間エラー(Linux Ubuntuのみ)

作成日 2016年10月13日  ·  16コメント  ·  ソース: socketio/socket.io-client

デバイス上で実行することを目的としたNodeJSスクリプトと、サーバー上のアプリがあります。 デバイスをサーバー上の/device名前空間に接続したいと思います。 これはWindowsで完全に機能します。 ただし、Ubuntuでは、デバイスが接続することはありません。 DEBUG env変数をに渡すと、次の出力が得られます。

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件

socket.io-clientバージョン1.5.0でもこれに気づきました。 何らかの理由でopts.queryの値が名前空間名に追加され、「無効な名前空間」エラーが発生したようです。

例:

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

名前空間/helloに接続する必要がありますが、代わりに名前空間/hello?foo=barに接続しようとします。

1.4.8でテストしましたが、エラーは発生しなかったため、このバグはその後どこかに導入されました。 (また、このバグは、Win7とMint Rosaで再現できるため、Ubuntuに関連しているとは思いません。)

ああ、それは理にかなっています。 うーん。 救済策のアイデアはありますか、またはこれを修正したい場合はリポジトリのどこを探す必要がありますか?

これを修正する方法はわかりませんが、このバグが存在しない場合は[email protected]にダウングレードできます。とにかく、それを実行しました。

https://github.com/socketio/socket.io-client/pull/943 (およびhttps://github.com/socketio/socket.io/pull/2422)にリンクされている可能性があります

v1.4.8でテストしたところ、期待どおりに機能しました。 次に、クライアントだけでv1.5を使用してテストしたところ、機能しなくなりました。 ただし、サーバーとクライアントにv1.5をインストールすると、問題が修正されました。

したがって、バグはクライアントとサーバーの間にバージョンの不一致がある場合にのみ発生するように見えますが、v1.5より上か下かにかかわらず、両方のバージョンが同じ場合には発生しません。

@ Arrow7000 1.6.0で問題が解決するかどうかを確認してください。

v1.7.2でもこの問題が発生します

@stgogmは、クライアントとサーバーの両方で1.7.2を使用していますか? それはまったく同じ問題ですか?

@darrachequesneはい、そうです。 エラーも同じです。たとえば、 /namespaceに接続してqをクエリパラメータとして渡す代わりに、 /namespace?q=valueに接続しようとします。

@stgogm失敗したテストケースを提供していただけますか? 再現できないようです: https

@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"と呼んでいます。

「/ visits」と「/ activities」の2つの名前空間ソケットを確立するビューがアプリにあります...「/ visits」ソケットは問題なく接続されます。 「/ activities」名前空間に接続しようとすると、「InvalidNamespace」メッセージが表示されます。

なぜこれを行っているのかわからない。 「/ homes」と「/ visits」を使用する別のビューでも同じパターンに従っており、両方のソケットがそのビューで問題なく確立されています。

@RavenHursTは、 activities名前空間が適切に作成されていますか? ( io.of('/activities'); )? ここでフィドルの問題を再現できますか?

ええ...まあ悪い..名前空間をサーバー側に追加するのを忘れていて、ここで更新するのを忘れていました。 無視してください :-/

このページは役に立ちましたか?
0 / 5 - 0 評価