2012-10-05 13 views
6

Pierwszy problem
Próbuję dowiedzieć się sesji, sklepów, autoryzacji i redis. Jeśli jest to ważne, używam [email protected]. Rozumiem, że mam dwie możliwości umieszczenia mojego RedisStore(). Którego używam? Czy używam obu?W pliku node.js jak skonfigurować redis za pomocą socket.io i wyrazić? W szczególności przy użyciu RedisStore()

express.session({secret: 'secret', key: 'key', store: new RedisStore()}); 
io.set('store', new RedisStore()); 

mam już node.js, express i socket.io uruchomiony. Teraz próbuję zaimplementować redis, ale nie wiem, jak zaimplementować autoryzację za pomocą sesji/sklepów i nie wiem, jak napisać do bazy danych redis. Nie znalazłem żadnej dokumentacji na ten temat. Znalazłem stronę, która mówi o sesjach i sklepach przy użyciu socket.io and express, ale nie ma redis, a druga mówi o sesjach i przechowuje using all three, ale nie używa ona io.set('store', ...).

Nie wiem również, czy powinienem użyć dwóch różnych sklepów, jednego dla express i jednego dla socket.io, lub jeśli powinienem użyć jednego. Spójrz na przykład dla wyjaśnienia:

//Redis Variables 
var redis = require('socket.io/node_modules/redis'); 
var RedisStore = require('socket.io/lib/stores/redis'); 
var pub = redis.createClient(); 
var sub = redis.createClient(); 
var client = redis.createClient(); 
var redis_store = new RedisStore({ 
         redisPub: pub, 
         redisSub: sub, 
         redisClient: client 
         }); 

app.configure(function(){ 
    //...code goes here... 
    app.use(express.session({ 
        secret: 'secret', 
        key: 'key', 
        store: redis_store //Notice I'm using redis_store 
        })); 
    //...more code... 
}); 

io.configure(function(){ 
    io.set('store', redis_store); //Notice it's the same RedisStore() being used 
}); 

Czy mogę używać tego samego RedisStore() dla każdego? Czy mogę stworzyć osobne dla każdego? Czy po prostu używam express lub socket.io? To, czego naprawdę chcę, to móc uwierzytelniać klientów (zakładam, że odbywa się to za pośrednictwem sesji) i aktualizować bazę danych redis po nawiązaniu połączenia - prowadząc dziennik, kiedy ludzie odwiedzali moją witrynę. Co prowadzi do mojego drugiego problemu.


Drugi problem
więc nie mam pojęcia, jak do wglądu i edycji bazy danych Redis z tego punktu. Nie byłem w stanie przetestować to z powodu mojego pierwszego problemu, ale zakładam, że będzie to coś takiego:

io.sockets.on('connection', function(socket){ 
    var session = socket.handshake.session; 
    redis.put(session); 
}); 

Ja też nie widziałem żadnej dokumentacji na temat sposobu aktualizacji bazy danych Redis od wewnątrz węzła. js więc I bardzo wątpię, że redis.put() jest poprawna haha ​​terminologii. Odwiedziłem redis's website, ale nie mogę znaleźć poleceń dla node.js. Po prostu polecenia do używania zwykłych redis z wiersza poleceń. W każdym razie, jeśli ktoś mógłby wskazać mi właściwy kierunek, który byłby świetny. Dzięki. :)

+0

Uwaga: jeśli używasz hasła w swoim sklepie redis, będziesz musiał przekazać sam moduł redis pod klawiszem "redis" jako część swojego konstruktora RedisStore. Aby uzyskać więcej informacji, zobacz: http://stackoverflow.com/questions/13438613/redis-auth-error-with-node-js-and-socket-io – Konklone

Odpowiedz

3

Express i Socket.IO mają swoją własną integrację z Redis do zarządzania sesjami, jak widzieliście. Został zaprojektowany jako integracja z Blackbox, przy założeniu, że implementacja sesji sesyjnej jest niezależna od reszty kodu. Ponieważ jest niezależny, oznacza to, że nie możesz wejść i użyć adresu express lub socket.io, aby uzyskać bezpośredni dostęp do usługi Redis. Musisz dodać zwykłego klienta redis, takiego jak node_redis. Zaletą tego jest to, że nie musisz się martwić o wykonywanie tych wszystkich wywołań redis, zamiast tego będziesz wchodził w interakcje z interfejsami sesji sesji express lub socket.io.

Tak więc w twoim przypadku nr 1 możesz przekazać pojedynczą nową instancję RedisStore, a nie dwie nowe, tak jak to zrobiłeś. Lub możesz śledzić swój drugi link i mieć socket.io słuchać poprzez ekspresowe. W takim przypadku zintegrowałoby się to z zarządzaniem sesjami ekspresowymi. Dlatego nie widzisz w tym przykładzie dodatkowego wywołania oset ("sklep").

Prawdopodobnie wyda ci się zbędny, ale spróbuj pomyśleć o RedisStore jako specjalnym kliencie przeznaczonym wyłącznie do zarządzania sesjami. Nawet jeśli RedisStore prawdopodobnie polega na czymś takim jak node_redis, nie powinieneś próbować uzyskać do niego dostępu.Musisz dołączyć inną bibliotekę, aby uzyskać bezpośredni dostęp do bazy danych redis, zakładając, że najpierw chcesz przechowywać inne elementy poza sesją w Redis.

+0

Tak, planuję pisać inne rzeczy do bazy danych. Ok tak patrząc na [node_redis] (https://github.com/mranney/node_redis) Widzę, że już uzyskuję dostęp do tego za pomocą mojej zmiennej redis, ale żeby być czystym, mówisz, że powinienem "npm install redis" być na tym samym poziomie co socket.io, a następnie użyć tej instancji do mojego własnego dostępu do bazy danych? Ponadto, ponieważ mam zamiar to zrobić i wszystko, czego naprawdę chcę, ze sklepów express lub socket.io ma mieć dostęp do danych sesji, czy powinienem użyć do tego funkcji RedisStore()? A może powinienem polubić pierwszy link i użyć MemoryStore? – Aust

+0

Tak, prawdopodobnie będziesz chciał przestać używać klienta redis w pakiecie socket.io i dołączyć własne do katalogu głównego projektu. MemoryStore nie jest zły, ale jeśli chcesz mieć wiele serwerów sieciowych lub utrzymywać sesję przez ponowne uruchomienie węzła, będę trzymać się RedisStore. Jeśli chcesz zachować sesje redis, zajrzę do connect-redis, zamiast wyciągać magazyn redis z projektu socket.io. –

Powiązane problemy