2017-07-09 3 views
0

Könnte jemand bitte helfen Sie mir einen, diesen Teil des Codes zu verstehen:Socket.io Benutzersitzungen mit Redis und JWT

var auth = function(cb) { 
return _.wrap(cb, function(fn, data) { 
    redis.get(email, function(err, id){ 
    if (!err) throw err; 
    if (!id) return socket.disconnect('unauthorized'); 
    fn(data); 
    }); 
}); 
}; 

, die ich von diesem article bekam.

Ich verstehe nicht, was dort passiert, obwohl ich zu der Dokumentation lodash navigiert und über 'Wrap' Methode gelesen habe. Ich bin verwirrt, vor allem weil ich nicht sehen kann, wo in diesem Artikel diese "Auth" weiter verwendet wird! (Ich denke, das ist definiert, um irgendwo verwendet zu werden). Vielen Dank im Voraus.

Antwort

1

Also, lasst uns das kaputt machen. Zuerst weisen wir eine Funktion zu, die einen cb-Parameter an auth annimmt. Was macht diese Funktion, nun, es gibt das Ergebnis _.wrap zurück. Ein Blick auf die Dokumente, _.wrap ist eine Curry-Funktion, so dass es eine Arg (cb) und eine Funktion, und gibt eine neue Funktion, wo der erste Parameter an die Arg gebunden ist, und der Rest der Parameter sind ungebunden. In der Tat, die _.wrap Teil:

return _.wrap(cb, function(fn, data) { 
    /* code */ 
    fn(data); // inside of the redis scope 
}) 

ist wahrscheinlich übertrieben, da man in einem Verschluss von der äußeren Funktion sind, so könnte man nur tun:

return function(data) { 
    /* code */ 
    cb(data) // in the redis callbak scope, but that is still in the closed over scope 
} 

Ich bin ehrlich gesagt nicht sicher, warum sie hab das nicht gemacht (Hammer/Nagel?).

Gehen wir weiter.

So haben wir festgestellt, dass auth eine Funktion ist, die einen cb Parameter übernimmt und eine Funktion zurückgibt, die einen data Parameter verwendet. Diese Funktion ruft jetzt redis.get auf, um den Wert zu finden, der dem Schlüssel zugeordnet ist, der in email gespeichert ist (der aus dem umgebenden Gültigkeitsbereich abgerufen wird). Dann ruft er die zurückgegebene Callback-Funktion auf (die einen Fehler und eine ID akzeptiert) validiert die Parameter (trennt den Websocket, wenn die E-Mail nicht in redis verbunden ist) und ruft schließlich den ursprünglichen cb-Callback mit dem übergebenen

auf

ich bin mir nicht sicher, wo es im Code verwendet wird, aber die Idee ist, dass man es als anrufen:

let authCb = auth((data) => { console.log(data) }) 
authCb('test') 

und wenn die E-Mail in redis gefunden wird, dann sollte test an die Konsole angemeldet werden Im Kontext des Artikels würden Sie dies verwenden, um die Verbindung zu validieren, bevor Sie tatsächlich mit dem Socket kommunizieren (in der cb functi on)

+0

Vielen Dank! Könnten Sie bitte erklären "es dauert eine arg (cb) und eine Funktion, und gibt eine neue Funktion zurück, wo der erste Parameter an den arg gebunden ist, und der Rest der Parameter sind ungebunden" mehr? Oder, wenn möglich, auf ein Beispiel hinweisen? Ich kam näher, in der Tat verstehe ich die meisten Ihrer Antwort, vor allem die endgültige Idee (weil es eindeutig angegeben ist), aber immer noch nicht verstehen, warum diese "Var Auth" definiert ist, aber nie verwendet! Wenn Sie es auch nicht sehen, überlasse ich es als "vielleicht ein Fehler in dem Artikel". Die allgemeine Idee ist jetzt klar. –

+1

Also im Beispiel-Code in diesem Artikel, der gleiche Code-Block wie die Auth-Funktion, Zeile 24 beginnt es verwendet werden. Hoffe, dass hilft –

+0

Es war das einzige, was ich in diesem Artikel nie gelesen habe! Als ich an socket.on (...) gewöhnt war, habe ich einfach übersprungen und verpasst, dass Auth verwendet wird, was die Frage aufwarf, danke, endlich verstanden! –

Verwandte Themen