복붙노트

[REDIS] Node.js를하고 socket.io와 레디 스의 인증 오류

REDIS

Node.js를하고 socket.io와 레디 스의 인증 오류

나는 암호없이 잘 레디 스 내 노드 응용 프로그램을 연결할 수 있지만 내가 암호를 추가 할 때, 내가 할 아무 권리입니다.

다음 예에서 바로 찍은 지금 내 코드입니다 :

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 }));

응용 프로그램을 실행, 나는이 스택 트레이스를 얻을 :

/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)

이 생성 선은 마지막 하나입니다 - 나는 RedisStore을 설정하려는 시도를 주석 경우, 나는 오류를하지 않습니다.

나는 암호가 (내가 레디 스-CLI에서 확인할 수 있으며, 내가 잘못 될 암호를 변경하면 나는 인증 콜백 화재를하지 않는 것을 확인할 수 있습니다) 권리입니다 확신합니다. 내가 암호를 제거하고이 개 인증 라인을 주석 처리하면이 코드는 작동합니다.

블로그 게시물 및 문서와이 일을해야하고, 내가 아닌 내가 왜 모르는 등 쇼에 작업의 모든 예. 내가 보는 스택의 어느 부분을 모른다.

여기에 내가 위의 코드를 실행할 때처럼 모니터 외모-CLI를 레디 스 내용은 다음과 같습니다

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"

그리고 여기가 인증 라인 위 밖으로 암호, 주석을 해제하고, 성공적으로 응용 프로그램을 실행하면 모니터 쇼 - CLI를 레디 스 내용은 다음과 같습니다

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"

성공적인 (암호없이) 연결 5 "정보"명령을 만들고, 내 실패 (passworded) 명령이한다 - 다음에 "on_info_cmd"메소드의 호출에 죽는다.

이러한 사람의 감각을 만들 수 있습니까? 당신이 줄 수있는 모든 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.나는 레디 스가 RedisStore 생성자에 옵션으로 자체 모듈 전달하여이 문제를 해결했다.

    나는 레디 스가 RedisStore 생성자에 옵션으로 자체 모듈 전달하여이 문제를 해결했다.

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

    클라이언트 객체가 instanceof를의 RedisClient 테스트를 통과하고 암호없이 다시 초기화 할 수 없습니다에 대한이 필요했다. 분명히, 때 RedisStore 다시 필요로하는 레디 스 모듈은 createClient 방법으로 만든 클라이언트 새로운 클래스 또는 무언가의 구성원을 레디 스.

    내가 관련된 문제 누군가가 socket.io의 문제 # 808에 가졌다보고이 아웃 생각.

  2. ==============================

    2.redisClient.auth 호출 (암호 기능 (ERR를) {경우 (잘못을) 던져 ERR을;}) 시도; 한 번만, 오류가 발생 할 수 있습니다 두 번 호출, 상점마다 호출에 대한 인증 정보를 레디 스.

    redisClient.auth 호출 (암호 기능 (ERR를) {경우 (잘못을) 던져 ERR을;}) 시도; 한 번만, 오류가 발생 할 수 있습니다 두 번 호출, 상점마다 호출에 대한 인증 정보를 레디 스.

  3. from https://stackoverflow.com/questions/13438613/redis-auth-error-with-node-js-and-socket-io by cc-by-sa and MIT license