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

Oli*_*y50 9 session redis node.js express express-4

我只是想知道,在我的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))
Run Code Online (Sandbox Code Playgroud)

以下是两种情况下的输出结果(当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
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

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

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

谢谢!


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

注2:我正在使用Windows ...但不要害怕,它应该有相同的行为!

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

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

Nat*_*han 9

我以前如何做到这一点是在设置redis连接之间

var client = redis.createClient(global.redis.port, global.redis.host);
Run Code Online (Sandbox Code Playgroud)

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

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

  if(res === expectedValue)
    return startApp();
});
Run Code Online (Sandbox Code Playgroud)

基本上只是将代码放在回调中启动你的应用程序到redis查询,然后你将根据结果知道redis是否正在运行.


小智 7

2023 年更新:

要检查 redis 是否正在运行,只需使用:

await client.connect();
  if(client.isOpen){ 
    //your code
  }
Run Code Online (Sandbox Code Playgroud)

如果多次使用它,最好:

//check if redis is already running
if(!client.isOpen){
  await client.connect();
}
//your code
Run Code Online (Sandbox Code Playgroud)


vmx*_*vmx 6

2个问题,首先调用创建Redis的客户端是在错误的顺序,createClient()采取port先,那么host,还有另一种可选的options参数.

var client = redis.createClient(global.redis.port, global.redis.host);
Run Code Online (Sandbox Code Playgroud)

其次,你仍然无法达到你想要的目标;

  1. ready事件是异步触发的,它可能在您检查redisIsReady标志时没有收到就绪响应.
  2. 该标志redisIsReady将设置为true,但到目前为止,您的会话初始化代码可能已经执行.

在初始化会话对象之前,您必须等待才能获得errorready事件redis.

希望这可以帮助.


小智 6

例子:

 if (client.connected) {
    client.set(key, JSON.stringify(value));
  } else {
    console.log('redis not connected!');
  }
Run Code Online (Sandbox Code Playgroud)

  • 该命令不再可用。 (3认同)