私は間違いを犯しているかもしれませんが、クライアントでミドルウェアエラーをキャッチすることができません。サーバーコードは次のとおりです。
(function () {
'use strict';
var url = require("url"),
sio = require('socket.io')(3010);
//Authentification required
sio.use(function (socket, next) {
return next(new Error('refused client'));
});
}());
およびクライアントコード:
(function () {
"use strict";
//Network
var socket = io.connect(SOCKET_IO_SERVER);
socket.on('error', function(){
console.error(arguments);
});
}());
それで、それはバグですか?
編集:Chromeのネットワークタブを使用すると、「拒否されたクライアント」を含むpolling
リクエストが表示されます
誰も?
あなたの例を実行することはできません。 より良い方法は、失敗したテストまたはリポジトリに、失敗を確認するために実行できる例を提供することです。 これに影響を与える可能性のある他の要因が多すぎます。
問題をデバッグするためにどのような手順を実行しましたか?
+1
エラーがミドルウェアのnextにパラメーターとして渡されたときに、クライアント側でエラーコールバックが呼び出されていません。
編集
名前空間を使用する場合、ミドルウェアを名前空間にアタッチする必要があることがわかりました。
var nsp = io.of('/namespace');
// client never receives the error event
io.use(function (socket, next) {
return next(new Error('refused client'));
});
// this way works
nsp.use(function (socket, next) {
return next(new Error('refused client'));
});
@ oliveiragabriel07おかげで、それは正確な問題のようです。クライアントは実際に拒否されましたが、エラーを受け取りません。
動作する例外を除いて小さなリポジトリを作成しましたhttps://github.com/Korri/socket.io-issue688
'error'イベントハンドラーを使用してsocket.io1.0でクライアントのミドルウェアエラーをキャッチできます。
名前空間を使用するときにも同じ問題が発生します。 @ oliveiragabriel07ソリューションも私のために機能しましたが、クライアントは一般的な接続middelware(io.use)でスローされたエラーを受信できるはずだと思いますこれはsocket.ioサーバーの問題だと思います
@jbaezに同意します。
エラーをキャッチするには、next()の後に戻る必要があります。 これもexpress.jsのバグだと思います。
あなたはこのようにする必要があります:
io.use(function (socket, next) {
next(new Error('refused client'));
return;
});
これは良くない
io.use(function (socket, next) {
return next(new Error('refused client'));
});
最も参考になるコメント
名前空間を使用するときにも同じ問題が発生します。 @ oliveiragabriel07ソリューションも私のために機能しましたが、クライアントは一般的な接続middelware(io.use)でスローされたエラーを受信できるはずだと思いますこれはsocket.ioサーバーの問題だと思います