检查redis是否正在运行 – >节点js

我只是想知道,在我的NodeJS过程的开始,如果Redis是否启动(所以用户会话将被存储与否)。

这是我目前所拥有的:

var session = require('express-session'); var RedisStore = require('connect-redis')(session); var redis = require("redis"); var client = redis.createClient(global.redis.host, global.redis.port); // Check if redis is running var redisIsReady = false; client.on('error', function(err) { redisIsReady = false; console.log('redis is not running'); console.log(err); }); client.on('ready', function() { redisIsReady = true; console.log('redis is running'); }); // Here I use express-session, but I want to set a store only if redis is ready sessOptions = { [...] } // Store setting if (redisIsReady) { sessOptions.store = new RedisStore({ host: global.redis.host, port: global.redis.port }); } else { console.log("redis is not running - sessions won't be written to disk"); } // app.use(session(sessOptions)) 

以下是两种情况下的输出结果(当Redis运行或不运行时):

 redis is not running - sessions won't be written to disk redis is not running Error: Redis connection to 6379:localhost failed - connect ENOENT 

所以我有两个问题:

  1. 在设置SessionStore之前,如何检查redis是否正在运行(是否有同步检查redis是否正在运行)?

  2. 为什么即使在运行redis时也会给我一个错误?

谢谢!


注意 :我使用默认主机/端口(localhost,6379),RedisStore按预期工作。

注2 :我正在使用Windows …但不要担心,它应该有相同的行为!

更新 :问题#2通过vmx回答=>谢谢!

更新2 :问题#1由Nathan回答=>谢谢!

过去我是如何做到这一点的,是通过build立redis连接

 var client = redis.createClient(global.redis.port, global.redis.host); 

并且实际上启动我的应用程序,无论是expression还是自定义应用程序,我只是做一个非常简单的查询,例如:

 client.get(this.testKey, function(err,res) { if(err) throw err; if(res === expectedValue) return startApp(); }); 

本质上只是把代码启动你的应用程序在一个redis查询的callback,然后你就会知道redis是根据结果运行。

2问题,首先创buildRedis客户端的调用顺序是错误的, createClient()port ,然后是host ,还有另一个可选的options参数。

 var client = redis.createClient(global.redis.port, global.redis.host); 

其次,你仍然无法实现你想要的;

  1. ready事件是asynchronous触发的,在您检查redisIsReady标志时可能没有收到就绪响应。
  2. 标志redisIsReady将被设置为true,但是现在你的会话初始化代码可能已经被执行了。

在初始化会话对象之前,您必须等待,然后才能从redis收到errorready事件。

希望这可以帮助。