Ошибка подключения приложения express node.js к серверу redis при использовании requirepass в redis.conf - PullRequest
1 голос
/ 29 сентября 2011

Я новичок в узле и redis и настраиваю простой сервер с экспресс-связью для связи с redis.

После запуска redis-сервера я запускаю сервер узла app.js

app.js запускается и запускается, когда я использую файл redis.conf без requirepass, но когда я добавляю requirepass, приложение вылетает при запуске.Я могу запустить redis-cli в терминале, и там работает пароль.

Я получаю этот стек Uncaught ошибок при запуске 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 

Я все еще пытаюсь разобраться с асинхронной природой узла, поэтому я подумал, что это может быть случай, когда аутентификацияКоманда вызывалась до того, как было установлено соединение с сервером redis, но когда я поместил команду auth в обратный вызов для client.on (событие «connect», я получил тот же стек ошибок.

Мне было интересноесли перехват исключения позволил бы серверу подмести его под ковер и продолжить, поэтому я поймал его, используя объект процесса. Сервер, кажется, продолжает работать, но не отображает какие-либо страницы в браузере, поэтому я предполагаю, что это исключение можетне игнорируется.

1 Ответ

4 голосов
/ 29 сентября 2011

Моя проблема была вызвана настройкой моего приложения с объектом RedisStore для обработки сеансов.После включения пароля в файле redis.conf необходимо создать объект RedisStore с параметром передачи, установленным для пароля в redis.conf.

Массив параметров установлен следующим образом:

    var redisStoreOpts = {'pass':REDIS_PASS};

и строка в конфигурации приложения изменяется следующим образом:

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

Я надеюсь, что это полезно для всех, кто сталкивается с этой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...