检查redis是否正在运行->node js

mi7gmzs6  于 2023-01-12  发布在  Redis
关注(0)|答案(6)|浏览(149)

我只是想知道,在我的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是否正在运行的方法)?
1.为什么即使在redis运行时它也给我一个错误?
谢谢!

    • 注意**:我使用的是默认主机/端口(localhost,6379),RedisStore按预期工作。
    • 注2**:我正在使用Windows ...但不要害怕,它应该有相同的行为!
    • 更新**:问题2由 * vmx *=〉回答,谢谢!
    • 更新2**:问题#1由 * Nathan * 回答=〉谢谢!
w3nuxt5m

w3nuxt5m1#

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

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

第二,你仍然无法达到你所努力的目标;

  1. ready事件是异步触发的,在您检查redisIsReady标志时,它可能尚未收到就绪响应。
    1.标志redisIsReady将被设置为true,但此时您的会话初始化代码可能已经执行。
    在初始化会话对象之前,必须等待从redis获得errorready事件。
    希望这个有用。
qcuzuvrc

qcuzuvrc2#

示例:

if (client.connected) {
    client.set(key, JSON.stringify(value));
  } else {
    console.log('redis not connected!');
  }
izj3ouym

izj3ouym3#

您也可以使用节点redis API进行检查:

if (client.connected){
  ...
} else {
  ...
}
wlsrxk51

wlsrxk514#

因为没有其他答案提到内置解决方案。节点Redis有一个ping()函数,执行时返回PONG。

const client = createClient( < CONNECTION_INFO> )

client.connect()

client.ping()
// PONG when healthy
cedebl8k

cedebl8k5#

您可以简单地使用sudo service redis-server status来检查本地机器上redis的当前运行状态,希望它能有所帮助。

guz6ccqo

guz6ccqo6#

我过去是如何做到这一点的是在通过设置redis连接

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

实际启动应用程序时,无论是Express应用程序还是自定义应用程序,我只需要执行一个非常简单的查询,例如:

client.get(this.testKey, function(err,res) {
  if(err) 
    throw err;

  if(res === expectedValue)
    return startApp();
});

实际上,只需将启动应用的代码放在redis查询的回调函数中,然后就可以根据结果知道redis是否正在运行。

相关问题