在redis.conf中使用requirepass时,将express.js应用程序连接到redis服务器时出错

时间:2011-09-28 21:12:15

标签: node.js redis express

我是node和redis的新手,我正在设置一个简单的服务器,使用express来与redis进行通信。

启动redis-server后,启动节点服务器app.js

当我使用不带requirepass的redis.conf文件时,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 

我仍然试图了解节点的异步性质,所以我想也许这是在建立与redis-server的连接之前调用auth命令的情况,但是当我放置auth时命令进入client.on的回调(“connect”事件我收到了相同的错误堆栈。

我想知道捕获异常是否允许服务器将其扫到地毯下并继续,所以我使用进程对象捕获它。服务器似乎继续运行但不会向浏览器提供任何页面,所以我猜这个例外是不容忽视的。

1 个答案:

答案 0 :(得分:4)

我的问题是由使用RedisStore对象配置我的应用程序来处理会话引起的。在redis.conf文件中启用密码后,需要使用redis.conf中设置为密码的pass选项创建RedisStore对象。

options数组的设置如下:

    var redisStoreOpts = {'pass':REDIS_PASS};

并且应用配置中的行更改为如下所示:

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

我希望这对遇到这个问题的人有用。