2012-11-18 31 views
7

Düğümümü Redis'e şifresiz bir şekilde gönderebilirim, ancak bir parola eklediğimde hiçbir şey doğru değil. İşte Node.js ve socket.io ile Redis auth hatası

an example sağ alınmış şu anda benim kod verilmiştir:

var redis = require('redis') 
    , sio = require('socket.io') 
    , RedisStore = sio.RedisStore 
    , io = sio.listen(); 

var port = 6379 
    , hostname = 'localhost' 
    , password = 'password'; 

var redisClient = redis.createClient(port, hostname); 
redisClient.auth(password, function (err) { if (err) throw err; }); 

var redisSubscriber = redis.createClient(port, hostname); 
redisSubscriber.auth(password, function (err) { if (err) throw err; }); 

io.set('store', new RedisStore({ redisPub: redisClient, redisSub: redisSubscriber, redisClient: redisClient })); 

app çalışan, ben bu yığın izleme almak:

/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:506 
       throw callback_err; 
        ^
Error: Ready check failed: ERR operation not permitted 
    at RedisClient.on_info_cmd (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:319:35) 
    at Command.RedisClient.ready_check.send_anyway [as callback] (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:367:14) 
    at RedisClient.return_error (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:502:25) 
    at RedisReplyParser.RedisClient.init_parser (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:262:14) 
    at RedisReplyParser.EventEmitter.emit (events.js:93:17) 
    at RedisReplyParser.send_error (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/lib/parser/javascript.js:266:14) 
    at RedisReplyParser.execute (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/lib/parser/javascript.js:125:22) 
    at RedisClient.on_data (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:478:27) 
    at Socket.<anonymous> (/home/eric/christmas/sockets/node_modules/socket.io/node_modules/redis/index.js:79:14) 
    at Socket.EventEmitter.emit (events.js:93:17) 

bu son biridir üreten çizgi - eğer RedisStore'u ayarlama girişimini açıklarım, herhangi bir hata almıyorum.

Parola doğruysa eminim (redis-cli dosyasında doğrulayabilirim ve eğer parola yanlış olursa değiştirirseniz, auth geri çağrılarının tetiklenmediğini doğrulayabilirim). Bu kod ayrıca şifreyi kaldırır ve iki hat satırını yorumlarsam çalışır.

Blog gönderilerindeki, çalışanların ve benzerlerinin tüm çalışma örnekleri bunun işe yarayacağını ve neden benimkinin olmadığını bilmiyorum. Yığının hangi kısmının bakılacağını bilmiyorum.

1353227107.912512 [0 127.0.0.1:56759] "auth" "password" 
1353227107.912719 [0 127.0.0.1:56758] "auth" "password" 
1353227107.913470 [0 127.0.0.1:56759] "info" 
1353227107.913639 [0 127.0.0.1:56758] "info" 

Ve burada Redis-cli monitör üzerinde yetkilendirme satırları, ben şifreyi kapatırsanız gösterir bu, ve: İşte

Redis-cli monitör yukarıdaki kodu çalıştırdığınızda gibi görünür uygulamayı başarıyla çalıştırın:

1353227252.401667 [0 127.0.0.1:56771] "info" 
1353227252.402020 [0 127.0.0.1:56770] "info" 
1353227252.402131 [0 127.0.0.1:56769] "info" 
1353227252.402423 [0 127.0.0.1:56768] "info" 
1353227252.402611 [0 127.0.0.1:56767] "info" 
1353227252.406254 [0 127.0.0.1:56770] "subscribe" "handshake" 
1353227252.406287 [0 127.0.0.1:56770] "subscribe" "connect" 
1353227252.406314 [0 127.0.0.1:56770] "subscribe" "open" 
1353227252.406321 [0 127.0.0.1:56770] "subscribe" "join" 
1353227252.406326 [0 127.0.0.1:56770] "subscribe" "leave" 
1353227252.406337 [0 127.0.0.1:56770] "subscribe" "close" 
1353227252.406354 [0 127.0.0.1:56770] "subscribe" "dispatch" 
1353227252.406372 [0 127.0.0.1:56770] "subscribe" "disconnect" 

başarılı (şifresiz) bağlantısı 5 "info" komutları yapar, ve benim başarısız (passworded) komutu 2 yapar - ve daha sonra bir "on_info_cmd" yöntemi çağrısı üzerine ölür.

Bunu bilen var mı? Verebileceğiniz herhangi bir yardım için teşekkürler.

+0

Bunu (aşağıdaki yanıt) çözdüm ve RedisStore'un bir örneğini yetkilendirmek için Socket.io wiki dosyasını güncelledim: https://github.com/LearnBoost/socket.io/wiki/Configuring-Socket.IO – Konklone

cevap

9

Redis modülünün kendisini RedisStore yapıcısına bir seçenek olarak ileterek bunu çözdüm. istemci nesneleri instanceof RedisClient testi geçmek ve bir şifre olmadan yeniden başlatıldı değil

io.set('store', new RedisStore({redis: redis, redisPub: redisClient, redisSub: redisSubscriber, redisClient: redisClient })); 

Bu

gerekliydi. Görünüşe göre, RedisStore redis modülünü yeniden gerektirdiğinde, createClient yöntemiyle oluşturulan redis istemcileri yeni bir sınıfın veya bir şeyin üyeleridir.

Birisinin socket.io'nun issue #808 adresinde sahip olduğu ilgili bir soruna bakarak bunu anladım.

+0

Farklı hatalar vardı ama aynı çözüm yardımcı oldu ... Redis Express oturumları için de kullanıldığından ve belki de farklı modül mağaza ve istemci için kullanıldığından muhtemelen hata oldu. – esp

1

Yalnızca bir kez redisClient.auth(password, function (err) { if (err) throw err; }); numaralı telefonu aramayı deneyin, redis her arama için kimlik bilgilerini saklar, iki kez arayarak hata verebilir.

+0

aslında her istemci için sadece bir kez çağrılır - ilk kez redisClient üzerinde ve ikincisi redisSubscriber, ayrı bir örnek. – Konklone

+1

Evet anlıyorum, ancak istemci şifreyi "saklıyor", bu yüzden birden fazla örnek için çağırmanıza gerek yok. Lütfen [Node_redis] 'a (https://github.com/mranney/node_redis) ve [Auth Example]' e bakın (https://github.com/mranney/node_redis/blob/master/examples/auth.js) – Sdedelbrock

+1

Doğru - tüm sınıf için değil, her bir örnek için saklar. Bir pub, alt ve bir mağaza istemcisi oluşturan redis'i gördüğüm her bir örnek, bu modeli kullanır. Örnek: https://github.com/LearnBoost/socket.io/pull/551 – Konklone

İlgili konular