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

Bar*_*man 3 redis node.js express digital-ocean express-session

在DegitalOcean中,我必须管理两个服务器“ Nodeserver”和一个Redis服务器“ Redisserver”,方法是使前者上的节点/表达式应用程序可以使用后者的数据库进行连接。

为了进行本地测试,我还在“ 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”的redis-cli连接时,我能够访问远程“ Redis_server”数据库,并且也可以通过该数据库进行读取和写入操作。

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

以下是app.js文件,其中包含Express的会话和传递给该会话的RedisStore(将Redis客户端作为args接收)。

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);
Run Code Online (Sandbox Code Playgroud)

这是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;
Run Code Online (Sandbox Code Playgroud)

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

我想知道为什么在应用程序代码中的redisClient失败时,在Node_server的外壳(redis-cli)上的本地redis服务器的客户端中,到远程服务器的连接以及读取和写入操作都可以实现吗?

在redis_6379.log中未提及任何错误

最好的祝福

Bar*_*man 6

我先解决了

client.on("error", function (err) {
    console.log("Error " + err);
});
Run Code Online (Sandbox Code Playgroud)

所以我可以看到哪里出了问题(实际上,我的错误是认为redisClient属于connect-redis模块,因此我在node_redis模块上没有看到所有这些可用的选项..),并且添加的代码向我显示了问题所在就像在这个线程中一样,并且由于这个答案,而且,我看到最好将set方法移到集合的回调中,因为远程服务器会异步响应。