13

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

だから私は2つの質問があります:

  1. SessionStore を設定する前に redis が実行されているかどうかを確認するにはどうすればよいですか (redis が実行されているかどうかを同期的に確認する方法はありますか) ?

  2. redis が実行されている場合でもエラーが発生するのはなぜですか?

ありがとう!


: デフォルトのホスト/ポート (localhost、6379) を使用しており、RedisStore は期待どおりに動作します。

注 2 : 私は Windows を使用していますが、心配する必要はありません。同じ動作をするはずです。

更新: vmxが回答した質問 #2 => ありがとう!

更新 2 : Nathanが回答した質問 #1 => ありがとうございます。

4

5 に答える 5

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 が実行されているかどうかがわかります。

于 2014-06-15T17:29:35.217 に答える
7

2 つの問題、最初に Redis クライアントを作成するための呼び出しの順序が間違ってcreateClient()います。porthostoptions

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

第二に、あなたがしようとしていることを達成することはまだできません。

  1. イベントは非同期的にトリガーされます。フラグreadyを確認するまでに、準備完了の応答を受信して​​いない可能性があります。redisIsReady
  2. フラグredisIsReadyは true に設定されますが、セッション初期化コードは既に実行されている可能性があります。

セッション オブジェクトを初期化する前に、 errororreadyイベントを取得する前に待機する必要があります。redis

お役に立てれば。

于 2014-06-15T17:23:37.757 に答える