我只是想知道,在 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回答 => 谢谢!
我过去是如何做到这一点的,是通过
设置 Redis 连接var client = redis.createClient(global.redis.port, global.redis.host);
实际上启动我的应用程序,无论是快速应用程序还是自定义应用程序,我只需执行一个非常简单的查询,例如:
client.get(this.testKey, function(err,res) {
if(err)
throw err;
if(res === expectedValue)
return startApp();
});
本质上只需将启动应用程序的代码放在 Redis 查询的回调中,然后您就可以根据结果知道 Redis 是否正在运行。
2023 更新:
要检查 redis 是否正在运行,只需使用:
await client.connect();
if(client.isOpen){
//your code
}
如果多次使用它,最好:
//check if redis is already running
if(!client.isOpen){
await client.connect();
}
//your code
2个问题,首先创建Redis客户端的调用顺序错误,
createClient()
首先采用port
,然后是host
,还有另一个可选的options
参数。
var client = redis.createClient(global.redis.port, global.redis.host);
其次,你仍然无法实现你想要的目标;
ready
事件是异步触发的,当您检查redisIsReady
标志时,它可能尚未收到就绪响应。redisIsReady
将设置为 true,但现在您的会话初始化代码可能已经执行了。在初始化会话对象之前,您必须等待从
error
获得 ready
或 redis
事件。
希望这有帮助。
示例:
if (client.connected) {
client.set(key, JSON.stringify(value));
} else {
console.log('redis not connected!');
}
因为没有其他答案提到内置解决方案。 Node Redis 有一个 ping() 函数,执行时返回 PONG。
const client = createClient( < CONNECTION_INFO> )
client.connect()
client.ping()
// PONG when healthy
您还可以使用node redis api进行检查:
if (client.connected){
...
} else {
...
}
您可以调用函数 hello() 来检查连接
您可以简单地使用
sudo service redis-server status
来查看本地机器上redis当前的运行状态。希望有帮助。