2011-09-28 4 views
1

저는 redirect를 사용하는 노드가 새로 생겼으며 express가있는 간단한 서버를 설정하고 있습니다.redis.conf에서 requirepass를 사용할 때 express node.js 앱을 redis 서버에 연결하는 중 오류가 발생했습니다.

레디 스 서버를 시작한 후, 나는 requirepass없이 redis.conf 파일을 사용하면 노드 서버가

app.js 시작 및 실행을 app.js 시작하지만 시작시 requirepass에게 응용 프로그램 충돌을 추가 할 때 . 터미널에서 redis-cli를 실행할 수 있으며 암호가 거기에서 작동합니다. app.js 실행할 때

나는이 처리되지 않는 오류 스택을 얻을 :

throw e; // process.nextTick error, or 'error' event on first tick 
    ^
    Error: Uncaught, unspecified 'error' event. 
    at RedisClient.emit (events.js:47:15) 
    at Command.callback (/node_modules/redis/index.js:232:29) 
    at RedisClient.return_error (/node_modules/redis/index.js:382:25) 
    at RedisReplyParser.<anonymous> (/node_modules/redis/index.js:78:14) 
    at RedisReplyParser.emit (events.js:64:17) 
    at RedisReplyParser.send_error (/node_modules/redis/lib/parser/javascript.js:265:14) 
    at RedisReplyParser.execute (/node_modules/redis/lib/parser/javascript.js:124:22) 
    at RedisClient.on_data (/node_modules/redis/index.js:358:27) 
    at Socket.<anonymous> (/node_modules/redis/index.js:93:14) 
    at Socket.emit (events.js:64:17) 

여기 app.js 여기

var REDIS_PASS = "foobar"; 

    var express = require('express'); 
    var app = module.exports = express.createServer(); 
    var io = require('socket.io').listen(app); 
    var redisStore = require('connect-redis')(express); 
    var redis = require('redis'); 
    var rdb = redis.createClient(); 
    rdb.auth(REDIS_PASS, function(){ console.log('connected to redis-server');}); 

    rdb.on("error",function(err){ 
    console.log("REDIS CLIENT ERROR:" + err + '\n\n' + err.stack); 
    }); 

에서 관련 코드가 redis.conf 파일을 것입니다을

# Warning: since Redis is pretty fast an outside user can try up to 
    # 150k passwords per second against a good box. This means that you should 
    # use a very strong password otherwise it will be very easy to break. 
    # 
    #my hackerproof password: 
    requirepass foobar 

나는 여전히 노드의 비동기 성질에 대해 머리를 쓰려고 노력하고있다. 그래서 이것은 아마도 t 그는 auth 명령이 redis-server에 연결되기 전에 호출되었지만 auth 명령을 client.on ("connect"이벤트에 대한 콜백에 넣었을 때 동일한 오류 스택을 받았습니다.

예외를 잡으면 서버가 카펫 밑으로 쓸어 넘기고 계속해서 프로세스 객체를 사용하여 잡았는지 궁금했습니다. 서버는 계속 실행되지만 브라우저에 어떤 페이지도 제공하지 않으므로이 예외를 무시할 수 없다고 생각합니다.

+0

[API] (https://github.com/mranney/node_redis)에 언급 된 redis 클라이언트가 내 보낸 "error"이벤트에 대한 수신기를 설정하고 해당 내용이 무엇인지 확인하고 (출력물을 출력 해주세요). – yojimbo87

+0

나는 node_redis 문서를보고 CreateClient가 옵션 매개 변수를 취할 수 있음을 알았습니다. 내 CreateClient를 다음과 같이 편집했습니다 : var opts = { 'auth_pass': true}; var rdb = redis.createClient (6379, '127.0.0.1', opts); 이제는 제대로 작동하고있는 것 같습니다 – Jason

+0

추가 검사에서 문제는 연결 설정과 함께 사용하여 발생했다고 생각합니다. 주석을 달고 앱 구성에서 제거하면 CreateClient 호출에 options 매개 변수를 추가하지 않아도 문제가 사라집니다. – Jason

답변

4

내 문제는 세션을 처리 할 RedisStore 개체로 내 응용 프로그램을 구성하여 발생했습니다. redis.conf 파일에서 암호를 활성화 한 후 redisStore 객체는 redis.conf에서 암호로 설정된 pass 옵션을 사용하여 만들어야했습니다.

옵션 배열은 다음과 같이 설정됩니다

var redisStoreOpts = {'pass':REDIS_PASS}; 

앱 구성의 라인은 다음과 같이 변경됩니다 :

app.use(express.session({ secret: SESSION_SECRET, store: new RedisStore(redisStoreOpts) })); 

나는이로 실행하는 사람에게 유용한 희망 이 문제.

관련 문제