JavaScript NodeJS express.session

  • Ersteller Ersteller omaliesschen
  • Erstellt am Erstellt am
O

omaliesschen

Gast
Hi,

nachdem die Websockets nun laufen versuche ich den Nutzern eine Session.id zuzuordnen.

Der aktuell bestehende Code parsed den PHPSESSID Cookie und fügt die ID in in ein Set in der RedisDb.

Damit lässt sich der Besucher auch bei einem refresh erkennen.

Leider gefällt mir die Vorgehensweise nicht und ich würde gerne mit express.session arbeiten.

Code:
app.use(express.session({ 
  store: new RedisDB({
    host:'127.0.0.1', 
    port:6380, 
    db: 2,
    key: 'sid',
    prefix:'mt-sid'}), 
  secret: 'md5' }));

Der Code funktioniert eigentlich. Hatte es im Vorfeld getestet. Über den redis-cli findet man allerdings keine Einträge?

Code:
redis 127.0.0.1:6379[2]> keys *
(empty list or set)
Ergänzung ()

OT:
Versteht jemand folgende JS Zeilen?

r ist unbekannt. Das ganze ist ein keyupevent.


Code:
return $("#commentText").val() ?
(0==r&&(r=!0,setTimeout( function(){r=!1},1e4),socket.emit('status', connectiondetails)),void 0) 
: !1
 
Zuletzt bearbeitet:
Das sind leider zu wenig Informationen, um Dir vernünftig helfen zu können.

1.) Welche Versionen nutzt Du? (node.js, redis, etc) Linux, Windows, Mac?

2.) Es ist nicht nachvollziehbar, welche node.js Module Du lädst oder nicht lädst, daher wäre zumindest ein vollständiger Auszug Deiner JS Datei besser.

3.) Der node.js Code baut eine Verbindung mit Redis über den Port 6380 auf, auslesen tust Du die Einträge aber über den Port 6379 !? Auf welchem Port läuft Redis denn nun? Der Default Port ist nämlich 6379! Schon mal redis-store ausprobiert?

4.) Zu Deinem Code Problem mit der Variable "r" kann ich nur auf meinen Punkt 2.) verweisen... wird "r" überhaupt irgendwo definiert?
 
Zuletzt bearbeitet:
Der node.js Code baut eine Verbindung mit Redis über den Port 6380 auf, auslesen tust Du die Einträge aber über den Port 6379 !? Auf welchem Port läuft Redis denn nun? Der Default Port ist nämlich 6379! Schon mal redis-store ausprobiert?

[...] :rolleyes: Übersehen. Danke.



Zu Deinem Code Problem mit der Variable "r" kann ich nur auf meinen Punkt 2.) verweisen... wird "r" überhaupt irgendwo definiert?

r wird ständig neu definiert. Der Quelltext ist leider recht unleserlich. Um die Logik nachvollziehen zu können sollte es doch uninteressant sein bzw.?
Ergänzung ()

Anmerkung:

Es findet sich immer noch nichts in der redis db:

node v0.10.8
express 3.2.5

Code:
var express = require("express")
  , app     = express() 
  , http    = require('http')
  , server  = http.createServer(app)
  , io      = require('socket.io').listen(server)
  ,_redis   = require("redis")
  ,RedisDB  = require('connect-redis')(express)
  ,redis    = _redis.createClient();


app.configure(function () {

    //app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({ 
        store: new RedisDB({
            host:'127.0.0.1', 
            port:6379, 
            db: 2,
            key: 'mt_sid'}), 
        secret: 'md5' }));

});
Ergänzung ()

Für den Codeschnippsel wurde auf Stackoverflow eine gute Antwort gegeben.

http://stackoverflow.com/questions/...nation-for-some-lines?answertab=votes#tab-top

Code:
return $("#commentText").val() ?
(0==r&&(r=!0,setTimeout( function(){r=!1},1e4),socket.emit('status', connectiondetails)),void 0)
: !1

becomes (as best I can figure it):

Code:
if ($("#commentText").val()) {
    if(0==r) {
        r = true;
        setTimeout( 
            function(){ r = false},1000
        );
        socket.emit('status', connectiondetails)
    }
}
else {
    return false;
}

Some mappings that are used:

Code:
true        -> !0     (saves 2 characters)
false       -> !1     (saves 3 characters)
if(x) { y } -> x && y (saves 5 characters)
1000        -> 1e4    (saves 1 character)
 
Zuletzt bearbeitet:
1e4 = 10.000. 1*10^4
Die Notation des Schnipsels ist aber tatsächlich mehr als eigenartig. Gerade dieses (Wertzuweisung, Wertzuweisung,Wertzuweisung) in Verbindung mit einem && ist alles andere als klar lesbar. Im Endeffekt kann mans am schnellsten verstehen, indem man einfach mal ne JS-Konsole aufruft und direkt mal so ne Klammer füttert.

Solche Code Obfuscation macht verdammt wenig Sinn hinsichtlich des Speicherplatzes. Regulärer JS-Code kommt eh erst einmal durch n Kompressor wie YUI und wird danach eh per GZIP noch einmal geschrumpft. Selbst wenn du das ganze jQuery-Paket mit allen regulären Extensions in der Form umformatieren würdest, würdest du am Ende wohl n paar Dutzend Byte sparen...
 
Das ist ein Stück aus einer min.js Datei. Die Datei beinhaltet alle JS Funktionen der entsprechenden Seite.

Der Aufbau ist sehr verworren und alles ist irgendwie mit allem verknüpft. Allein den Wert für r zu finden würde mehr Zeit brauchen als ich vor hab zu investieren. Kaum wird eine neue Funktion gestartet verändert sich r.

r=n; Suche nach n. n=x(); suche nach x(), x(r=a);a = b?x:y;while(t<r){r=x}............

[...]

PS:
Das hier finde ich interessant:
Code:
if(x) { y } -> x && y

Wusste nicht dass das geht.
 
Zuletzt bearbeitet:
Das geht in vielen Sprachen. In PHP nutz ich sowas manchmal. Da ist nicht viel Magie dahinter. Wenn der Compiler/Interpreter über ein && stolpert guckt er sich die Werte von links nach rechts an. Wenn der jeweils linke Wert eines AND-Vergleichs FALSE ergibt, dann macht es keinen Sinn, den rechten Ausdruck auszuwerten. Das Ergebnis von FALSE && irgendwas ist eh immer FALSE.

In einem anderen Thread hatten wir ja kürzlich if($a=5) -> TRUE [ich wähl hier mal PHP-Notation]. Wenn du jetzt sagen würdest ($b && ($a=5)), würde geguckt, ob $b einen von 0/NULL/FALSE verschiedenen Wert hat. Wenn nein, dann wird $a nicht auf 5 gesetzt. Wenn ja, dann wird $a eben 5 und anschließen wird geguckt, ob $a jetzt nicht 0/NULL/FALSE ist. Wenn das dann auch erfüllt ist, wird der gesamte Ausdruck wahr.

Viel interessanter wäre aber, was bei $a || ($b=5) für $b am Ende heraus kommt, wenn $a einen TRUE-Wert enthält. Ein optimierter Interpreter oder Compiler würde sich $a angucken, feststellen dass der gesamte Ausdruck wahr ist, und danach $b=5 nicht ausführen.
 
Daaron schrieb:
Viel interessanter wäre aber, was bei $a || ($b=5) für $b am Ende heraus kommt, wenn $a einen TRUE-Wert enthält. Ein optimierter Interpreter oder Compiler würde sich $a angucken, feststellen dass der gesamte Ausdruck wahr ist, und danach $b=5 nicht ausführen.

Da true || irgendwas immer zu true evaluiert, genau so wie false && irgendwas immer zu false evaluiert, würde die Zuweisung in beiden Fällen aus dem von dir genannten Grund nicht stattfinden, völlig ohne optimierten Compiler/Interpreter. Will man aber unbedingt eine vollständige Evaluierung des Ausdrucks erzwingen, so gibt es in den meisten Sprachen noch alternative Operatoren wie das einfache "&" und "|", dabei wird nicht abgebrochen und $a = 5 (aus deinem PHP Beispiel) würde immer stattfinden.

Nützlich ist das aber vor allem bei sowas: if(object != null && object.value == x). Würde der Operator hier nicht abbrechen, wenn object null ist, so würde man je nach Sprache sowas wie eine Nullpointer-Exception bekommen beim Zugriff auf value. Das erspart ein zweifach verschachteltes if.
 
Einfaches & oder | ist mit Vorsicht zu genießen. In einigen Sprachen (z.B. JS) lösen diese Operatoren einen Bit-Vergleich aus. Das Ergebnis kann dann reichlich verwirrend sein.
 
Ich meinte das | und & stellvertretend für alle möglichen Symbole, die es in den verschiedenen Sprachen so gibt. Aber du hast völlig recht, da wir hier in einem JS-Thread sind ist zu sagen, dass es in JS überhaupt keine "Eager" Operatoren gibt und | sowie & für Bitoperationen stehen. In einigen Sprachen sind die Symbole jedoch doppelt belegt (als Bit- und Logikoperator), beispielweise in C# und Java, in anderen gibt es andere Symbole (and und or vs. andalso, orelse in VB.net und Erlang).
 
Zuletzt bearbeitet:
Zurück
Oben