Redis 客户端连接到 redis 远程服务器,但无法在其上读取或写入

Redis client connects to the redis remote server but can't read or write on it

在 DegitalOcean 中,我必须管理两个服务器 'Nodeserver' 和一个 redis 服务器 'Redisserver',方法是使前者的 node/express 应用程序连接成为可能,以便使用后者的数据库。

出于本地测试的目的,我还在'Nodeserver'本地安装了另一个redis服务器'LocalRedisOnNodeServer'。

我已经将 'Redisserver' 配置为接受外部连接,就像在 https://www.digitalocean.com/community/tutorials/how-to-set-up-a-redis-server-as-a-session-handler-for-php-on-ubuntu-14-04 中一样,当尝试从 'LocalRedisOnNodeServer's redis-cli 连接时,我能够访问远程 'Redis_server' 也可以通过它进行数据库和读写操作。

我仍然没有为 'Redis_server' 配置任何安全措施(至于编辑 iptables..)我只设置了一个密码(在 redis.conf 中需要密码)我仍然没有不知道是否可以在此服务器上使用 SSH 进行更安全的身份验证(或者也为它配置我的应用程序代码)。

以下是 app.js 文件,其中包含 express 的会话和传递给会话的 RedisStore(接收 redis 客户端作为参数)。

var express = require('express');
var app = express();
var routes = require('./routes');
var errorHandlers = require('./middleware/errorhandlers');
var log = require('./middleware/log');
var partials = require('express-partials');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var redis = require('redis');
var config = require('./config');

app.set('view engine', 'ejs');
app.set('view options', {defaultLayout: 'layout'});

app.use(partials());
app.use(log.logger);
app.use(express.static(__dirname + '/static'));
app.use(cookieParser(config.secret));

console.log(config.redisConf);

var redisClient = redis.createClient(config.redisConf);

redisClient.on('connect', function() {
console.log('connected to redis!!');
});

redisClient.set('framework', 'AngularJS', function(err, reply) {
console.log('the framwork var was SET to AngularJS : the following is the server answer : ');
console.log(reply);
});

app.use(session({
secret: config.secret,
resave: false,
saveUninitialized: true,
store: new RedisStore({client: redisClient})

}));

// right after the session
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

app.get('/', routes.index);
app.get('/login', routes.login);
app.post('/login', routes.loginProcess);
app.get('/chat', routes.chat);
app.get('/account/login', routes.login);

app.get('/error', function(req, res, next){
next(new Error('A contrived error'));
});

app.use(errorHandlers.error);
app.use(errorHandlers.notFound);

app.listen(config.port);
console.log("App server running on port " + config.port);

这是 config.js :

var config = {
port: 3000,
secret: 'secret',

redisConf: {
host: 'xxx.xxx.xxx.xxx.', // The redis's server ip 
port: '6379',
pass: 'theredispass'
}
};    
module.exports = config;

我已经测试了应用程序与本地 redis 服务器的连接 'LocalRedisOnNodeServer',并且它是成功的以及读取和写入密钥(对于 set 和 get..)。 这证明应用程序代码没有问题。但是当我从本地 127.0.0.1 的 redis 主机(redisConf.host)更改为 'Redisserver' ip 时,只发生连接(redisClient.on('connect' 回调记录它是 'connected to redis!!' 但是读取和写入函数(get 和 set)失败,因为它们的回调没有被触发,另一个问题是无法创建 express 的会话并且它的值仍然未定义。

我想知道为什么在'Node_server的shell(redis-cli)上的本地redis服务器的客户端到远程的连接以及读写操作都是可能的服务器,而应用程序代码中的 redisClient 失败。

redis_6379.log

中未提及任何错误

此致

我首先通过添加

解决了它
client.on("error", function (err) {
    console.log("Error " + err);
});

所以我可以看出问题所在(实际上我的错误是认为 redisClient 属于 connect-redis 模块,所以我没有在 node_redis 模块上看到所有这些可用选项。)添加的代码告诉我问题就像 this thread and thanks to this answer 一样,而且我发现最好将 get 方法移到集合的回调中,因为远程服务器会异步响应..