2016-06-29 4 views
1

Socket.IO ermöglicht Middleware-Funktionen, Fehler zu übergeben.Benutzerdefinierte Socket.IO Middleware Fehlerereignisse?

var io = require('socket.io')(); 
io.use(function(socket, next){ 
    if (socket.request.headers.cookie) return next(); 
    next(new Error('Authentication error')); 
}); 

Der Client kann auf diese Fehler warten, indem er auf das Standardereignis 'error' wartet.

clientIO.on('error', function(err) { 
    console.log(err); 
} 

Gibt es eine Möglichkeit Socket.IO Middleware emit benutzerdefinierte Ereignisnamen anstelle von ‚Fehlern‘ (zum Beispiel ‚AUTHENTICATION_ERROR‘) zu haben?

Antwort

2

Von dem, was ich in der Code-Basis gesehen habe, sieht es nicht so aus. Fehlermeldungen werden über einen speziellen Pakettyp gesendet, der das Ereignis error im Client auslöst. Es handelt sich also in diesem Zusammenhang nicht um eine reguläre Nachricht (die Sie durch einen anderen Typ ersetzen könnten).

Sie haben die Möglichkeit, entlang Daten mit dem Fehler passieren, aber:

// server 
io.use(function(socket, next){ 
    if (socket.request.headers.cookie) return next(); 
    let err = new Error('Authentication error'); 
    err.data = { type : 'authentication_error' }; 
    next(err); 
}); 

// client 
clientIO.on('error', function(err) { 
    if (err.type === 'authentication_error') { 
    ... 
    } else { 
    ... 
    } 
} 
+1

Es scheint, als ob der Server die Fehlermeldung („Authentifizierungsfehler“) emittiert anstelle des gesamten Objekts Fehler, so dass es Es gibt keine Möglichkeit, auf die anderen Eigenschaften des Error zuzugreifen. Nicht sicher, ob dies ein nicht verwandtes Problem ist oder nicht. – user2901933

+1

Scheint, für mich mit der aktuellen Version von 'socket.io' (1.4.8) gut zu funktionieren. [Hier ist ein Kern] (https://gist.github.com/robertklep/a8adbdf15a210ac432e4cc1a75d912bf) mit dem Code, mit dem ich getestet habe. Ich glaube, dass Sie 'err.data' verwenden müssen, und keine zufällige Eigenschaft wie' err.type' oder so etwas. – robertklep