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

问题描述 投票:0回答:8

我只是想知道,在 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回答 => 谢谢!

node.js session express redis express-4
8个回答
15
投票

我过去是如何做到这一点的,是通过

设置 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 是否正在运行。


10
投票

2023 更新:

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

await client.connect();
  if(client.isOpen){ 
    //your code
  }

如果多次使用它,最好:

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

8
投票

2个问题,首先创建Redis客户端的调用顺序错误,

createClient()
首先采用
port
,然后是
host
,还有另一个可选的
options
参数。

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

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

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

在初始化会话对象之前,您必须等待从

error
获得
ready
redis
事件。

希望这有帮助。


6
投票

示例:

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

1
投票

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

const client = createClient( < CONNECTION_INFO> )

client.connect()

client.ping()
// PONG when healthy

0
投票

您还可以使用node redis api进行检查:

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

0
投票

您可以调用函数 hello() 来检查连接


-5
投票

您可以简单地使用

sudo service redis-server status
来查看本地机器上redis当前的运行状态。希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.