Node.js 如果redis不可用,我如何忽略它?

Node.js 如果redis不可用,我如何忽略它?,node.js,redis,node-redis,Node.js,Redis,Node Redis,我希望我的应用程序(比如说现在是一个简单的节点文件)能够正常工作,即使redis不可用。我不能用正确的方法做这件事。这就是我尝试过的 var redis = require('redis'); var redisClient = null; var getRedisClient = function(){ if(redisClient){ return redisClient; } try { redisClient = redis.c

我希望我的应用程序(比如说现在是一个简单的节点文件)能够正常工作,即使redis不可用。我不能用正确的方法做这件事。这就是我尝试过的

var redis = require('redis');
var redisClient = null;

var getRedisClient = function(){
    if(redisClient){
        return redisClient;
    }

    try {
        redisClient = redis.createClient({connect_timeout : 5000, max_attempts : 1});
        redisClient.on("error", function(err) {
            console.error("Error connecting to redis", err);
            redisClient = null;
        });
        return redisClient;
    } catch(ex){
        console.log("error initialising redis client " + ex);
        return null;
    }
};

try {
    var client = getRedisClient();
    console.log("done!");
} catch (ex){
    console.log("Exception");
}
但是,如果redis不可用,则使用此代码我的应用程序将退出(不应该退出,因为我没有给出process.exit()命令)

如何解决此问题?

启动时检查连接是否成功 使用承诺,您可以保证至少在最初,您能够在指定的时间段内无误地连接到redis:

const redis = require('redis');
const Promise = require('bluebird');

function getRedisClient(timeoutMs){
    return new Promise((resolve, reject) => {
        const redisClient = redis.createClient();
        const timer = setTimeout(() => reject('timeout'), timeoutMs);
        redisClient.on("ready", () => {
            clearTimeout(timer);
            resolve(redisClient);
        });
        redisClient.on("error", (err) => {
            clearTimeout(timer);
            reject(err);
        });
    });
};

const redisReadyTimeoutMs = 10000;

getRedisClient(redisReadyTimeoutMs)
    .then(redisClient => {
        // the client has connected to redis sucessfully
        return doSomethingUseful();
    }, error => {
        console.log("Unable to connect to redis", error);
    });
您需要正确的错误处理 redis客户端为非空时,不保证使用它不会抛出错误

  • 您可能会遇到基础设施故障,例如redis进程崩溃、内存不足或网络关闭

  • 代码中的错误可能会导致错误,例如redis命令的参数无效或丢失

您应该理所当然地处理redis客户端错误

null
Redis客户端出错

它不会给你太多,但它会迫使你每次尝试使用它时检查null

redis客户端还具有内置的重新连接和重试机制,如果在第一次出错后
null
null,您将错过这些机制。查看redis软件包文档,查找

使用
try.包装您的redis客户端代码。。捕获…
或在承诺链中使用
。捕获


DO使用
重试策略

我认为您的应用程序退出是因为它没有更多的事情可做。添加服务器或其他东西。@Farid否,如果redis已打开,则应用程序不会退出。当redis未打开时,应用程序将存在,因为它与此无关。当redis开启时,会有一个到redis服务器的持久连接,并且应用程序不会退出,因为连接没有关闭。节点只有在没有连接/服务器/事件或任何其他类型的IO时才会关闭。所以你是说这段代码没有问题?我觉得很好,但在产品测试之前,你不知道代码是否完美…:P