【问题标题】:Check if redis is running -> node js检查redis是否正在运行-> node js
【发布时间】:2014-08-05 14:03:39
【问题描述】:

我只是想知道,在我的 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...但不要害怕,它应该具有相同的行为!

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

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

【问题讨论】:

  • 你真的启动了服务器吗(输入redis-server &)?
  • 是的,我的 RedisStore 运行正常,Redis 成功保存了用户会话。我可以使用 redis_client 终端检索我的会话。我只是无法使用 createClient() 连接到 redis
  • node_redis 默认行为是从您调用redis.createClient 到建立连接的那一刻起对命令进行排队,因此您很可能只需实例化一个 RedisStore 并继续您的业务,而无需检查是否redis 准备好了。试一试。

标签: node.js session express redis express-4


【解决方案1】:

例子:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这只是检查连接,如果密码错误,连接仍然是真的。
    【解决方案3】:

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

    【讨论】:

    • 这对在 Windows 上运行的 NodeJS 应用程序中检查状态有何帮助?
    【解决方案4】:

    我过去的做法是在通过

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

    【讨论】:

    • 实际上,即使redis没有运行,我也想启动我的应用程序=/
    • 那么,与其像我一样抛出错误,不如设置一个布尔值,然后在尝试将任何内容存储到 redis 之前检查它是否为真。如果client.get()从redis获取值失败,还是会执行回调函数!
    • 确实如此。我的项目现在看起来有点难看。但至少它按预期工作。谢谢。
    • 这是有效的,因为 node_redis 将命令排队,直到建立连接,因此实际上回调在 redis 准备好时运行。但是对于大多数意图和目的,您不需要依赖它,您可以立即开始使用 redis,并相信在建立连接时事情会排队。
    • 我收到此错误:node_redis: Deprecated: The GET command contains a "undefined" argument. This is converted to a "undefined" string now and will return an error from v.3.0 on. Please handle this in your code to make sure everything works as you intended it to.
    【解决方案5】:

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

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

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

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

    在初始化会话对象之前,您必须等待从 redis 收到 errorready 事件。

    希望这会有所帮助。

    【讨论】:

    • 是的,我对参数顺序不好......所以现在它可以工作了。但是我是否必须在初始化会话之前等待 redis 回答...如果我必须在 "app.use(something-else)" 之前 "app.use(session)" 怎么办?
    • 使用 Nathan 的建议,做一个虚拟查询来检查 redis 连接并相应地初始化会话。您可以在查询结果回调中进行所有应用配置和初始化代码。
    • 实际上,即使redis没有运行,我也想启动我的应用程序=/
    • 你会跑的,不是吗?如果 Redis 查询无法访问/连接,可能会给您一个错误,您应该初始化会话以使用内存存储。如果得到结果,请使用 Redis 存储。
    • 谢谢 vmx,它可以工作。我给了你 +1 并且我接受了 Nathan 的回答(没有 +1),听起来很公平。
    猜你喜欢
    • 2012-04-09
    • 2021-10-27
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2018-10-12
    • 2014-08-25
    相关资源
    最近更新 更多