检查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
所以我有两个问题:
-
在设置SessionStore之前,如何检查redis是否正在运行(是否有同步检查redis是否正在运行)?
-
为什么即使在运行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);
其次,你仍然无法实现你想要的;
-
ready
事件是asynchronous触发的,在您检查redisIsReady
标志时可能没有收到就绪响应。 - 标志
redisIsReady
将被设置为true,但是现在你的会话初始化代码可能已经被执行了。
在初始化会话对象之前,您必须等待,然后才能从redis
收到error
或ready
事件。
希望这可以帮助。