2014-06-15 55 views
5

我只是想知道,在我的NodeJS進程開始時,Redis是否啓動(因此用戶會話將被存儲或不存儲)。檢查redis是否正在運行 - >節點js

這裏是我的時刻:

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 

所以我有2個問題:

  1. 怎麼可以我在設置SessionStore之前檢查redis是否正在運行(是否有同步檢查redis是否正在運行)?

  2. 即使在運行redis時,它爲什麼會給我一個錯誤?

謝謝!


注意:我使用的是默認的主機/端口(本地主機,6379)和RedisStore按預期工作。

注2:我使用Windows ...但不要擔心,它應該有相同的行爲!

更新:問題#2通過回答vmx =>謝謝!

更新2:問題#1通過回答Nathan =>謝謝!

+1

你真的啓動服務器(鍵入'redis-server&')? –

+0

是的,我的RedisStore按預期運行,Redis成功保存用戶會話。我可以使用redis_client終端檢索我的會話。我只是無法使用createClient() – Oliboy50

+0

連接到redis node_redis默認行爲是從您調用'redis.createClient'的那一刻起排隊命令,直到建立連接,所以很可能您可以實例化一個RedisStore並繼續您的業​​務無需檢查redis是否準備就緒。試一試。 – Mahn

回答

4

如何我在過去做了,這是在建立經

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

Redis的連接和實際開始我的應用程序,不管是明示或自定義的應用程序之間,我只是做一個非常簡單的查詢如:

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

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

本質上只是把代碼開始您的應用程序的回調裏面一個Redis的查詢,然後你就會知道,如果Redis的基於結果運行。

+1

實際上,即使redis未運行,我也想啓動我的應用程序=/ – Oliboy50

+0

那麼,不要像我那樣拋出一個錯誤,你可以設置一個布爾值,然後在你嘗試存儲任何內容之前檢查它是否爲真Redis的。如果client.get()無法從redis獲取值,它仍然會執行回調函數! – Nathan

+0

確實。我的項目現在看起來更醜陋了。但至少它按預期工作。謝謝。 – Oliboy50

5

2個問題,首先調用創建Redis的客戶端是在錯誤的順序,createClient()需要port第一,那麼host,還有另一種可選options說法。第二,你仍然無法實現你想要的;第二,你仍然不能實現你想要的;

  1. ready事件異步觸發,它可能沒有收到由當時準備響應您檢查的redisIsReady標誌。
  2. 標誌redisIsReady將被設置爲true,但現在您的會話初始化代碼可能已經執行。

你將不得不等待,你從redis得到errorready事件初始化會話對象之前之前。

希望這會有所幫助。

+0

是的,我的不好的參數順序...所以現在它的作品。但是,我是否有義務在初始化會話之前等待redis的回答......如果我必須在「app.use(something-else)」之前「app.use(session)」,該怎麼辦? – Oliboy50

+0

使用Nathan的建議,做一個虛擬查詢來檢查redis連接並相應地初始化會話。您可以在查詢結果回調中查看所有應用程序配置和初始化代碼。 – vmx

+0

其實,即使redis沒有運行,我也想啓動我的應用程序=/ – Oliboy50