我是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”事件我收到了相同的错误堆栈。
我想知道捕获异常是否允许服务器将其扫到地毯下并继续,所以我使用进程对象捕获它。服务器似乎继续运行但不会向浏览器提供任何页面,所以我猜这个例外是不容忽视的。
答案 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) }));
我希望这对遇到这个问题的人有用。