0

redisセンチネルクライアントプログラム-最初のプログラムで、redisセンチネルオブジェクトを作成したままにしておき、 KEY を設定すると正常に動作します。しかし、2 番目のプログラムを観察すると、client.on('connect', runSample(client)); 私はクライアント オブジェクト ( redis sentinel client ) を渡しています。これは接続パラメーター runSample にあります。このため、次のエラーが発生します..

エラーの詳細

https://github.com/DocuSignDev/node-redis-sentinel-client/blob/master/index.js

 RedisSentinelClient.prototype.send_command  undefined
  /node_modules/redis-sentinel-client/index.js:293
  return client.send_command.apply(client, arguments);
           ^
  TypeError: Cannot read property 'send_command' of undefined
at RedisSentinelClient.send_command (/node_modules/redis-sentinel-client/index.js:293:16)
at RedisSentinelClient.(anonymous function).RedisSentinelClient.(anonymous function) (/node_modules/redis-sentinel-client/index.js:307:23)
at runSample (/msg/lb4.expire.onefile.2m.notworking.js:25:13)
at init (/msg/lb4.expire.onefile.2m.notworking.js:16:26)
at Object.<anonymous> (/msg/lb4.expire.onefile.2m.notworking.js:75:1)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
RajRajen:pubsub.local rajrajen$

最初の作業プログラム..

'use strict';
 var client = getRedisSentinelObject();
 client.on('error', function(err) {
   console.log('Error ' + err);
 });

client.on('connect', runSample);

function runSample() {

   var allStrings = '{abc:123}';


   client.get(allStrings, function(err, reply) {
      if (reply) {
        console.log('Key is ' + reply.toString());
        client.ttl(allStrings, writeTTL);
    } else {
        console.log('string key expired or not set before!');
        // Set a value
        client.set(allStrings, allStrings);
        // Expire in 3 seconds
        client.expire(allStrings, 3);
    }
    client.quit();
    });
 }

 function getRedisSentinelObject() {
   
   var redisSentinelHost = process.env.REDIS_SENTINEL_SERVICE_HOST;
   var redisSentinelPort = process.env.REDIS_SENTINEL_SERVICE_PORT;

   var options = {
      'master_debug': false
    };


    var redisSentinelMasterDebug = process.env.REDIS_SENTINEL_MASTER_DEBUG;


if (typeof redisSentinelMasterDebug !== "undefined") {
    if (redisSentinelMasterDebug === "true") {
        options.master_debug = true;
    }
}

console.log('redisSentinelHost ', redisSentinelHost, 'redisSentinelPort ', redisSentinelPort);

var RedisSentinel = require('redis-sentinel-client');
var sentinelClient = RedisSentinel.createClient(redisSentinelPort, redisSentinelHost, options);
console.log('sentinelClient ', sentinelClient);

return sentinelClient;
}

function writeTTL(err, data) {
    console.log('I live for this long yet: ', data);
}

機能していない 2 番目のプログラム

 'use strict';

  function init() {

var client = getRedisSentinelObject();


client.on('error', function(err) {
    console.log('Error ' + err);
});

client.on('connect', runSample(client));

}

function runSample(client1) {


var allStrings = '{abc:123}';


client1.get(allStrings, function(err, reply) {
    if (reply) {
        console.log('Key is ' , reply.toString());
        client1.ttl(allStrings, writeTTL);
    } else {
        console.log('string key expired or not set before!');
        // Set a value
        client1.set(allStrings, allStrings);
        // Expire in 3 seconds
        client1.expire(allStrings, 2);
    }
   // client1.quit();
});


}

 function getRedisSentinelObject() {

var redisSentinelHost = process.env.REDIS_SENTINEL_SERVICE_HOST;
var redisSentinelPort = process.env.REDIS_SENTINEL_SERVICE_PORT;

var options = {
    'master_debug': false
};


var redisSentinelMasterDebug = process.env.REDIS_SENTINEL_MASTER_DEBUG;

if (typeof redisSentinelMasterDebug !== "undefined") {
    if (redisSentinelMasterDebug === "true") {
        options.master_debug = true;
    }
}

console.log('redisSentinelHost ', redisSentinelHost, 'redisSentinelPort ', redisSentinelPort);

var RedisSentinel = require('redis-sentinel-client');
var sentinelClient = RedisSentinel.createClient(redisSentinelPort, redisSentinelHost, options);
console.log('sentinelClient ', sentinelClient);

return sentinelClient;
}

function writeTTL(err, data) {
console.log('I live for this long yet: ', data);
}

init();

ありがとう

4

1 に答える 1

1

問題

例 1 には、次の行があります。

client.on('connect', runSample);

この行は、クライアントが接続したときに実行される関数を添付します。すべてが良いです。クライアントが接続するまで関数は実行されないことに注意してください。

例 2 では、同じ行が次のようになります。

client.on('connect', runSample(client));

この行では、runSampleメソッドがすぐに実行されます。次に、この関数呼び出しの結果 (この場合undefinedは ) が に渡されclient.onます。したがって、ここで手作業で少し評価を行うと、javascript は次のようになります。

client.on('connect', undefined);

「接続しても何もない」とredisに伝えているため、これは失敗します。

簡単な修正

これを修正する最も簡単な方法は、クロージャー (スコープを吸収する関数) を使用することです。これはおそらくあなたが意図したことです。

client.on('connect', function () {
    runSample(client)
});

より複雑な修正

もう少し複雑にしたい場合は、次のような関数を作成できます。

function buildRunner (client) {
   return function runTests () {
       var allStrings = '{abc:123}';


       client.get(allStrings, function(err, reply) {
           if (reply) {
               console.log('Key is ' + reply.toString());
               client.ttl(allStrings, writeTTL);
           } else {
               console.log('string key expired or not set before!');
               // Set a value
               client.set(allStrings, allStrings);
               // Expire in 3 seconds
               client.expire(allStrings, 3);
           }
           client.quit();
       });
   }
}

そして、次のように使用します。

client.on('connect', buildRunner(client));

以前と同様に、すぐbuildRunner実行されることに注意してください。違いは、に渡される関数を返すことです。もう一度手で評価すると、次のようになります。buildRunner client.on

client.on('connect', function runTests () { ... })
                  // ^ runTests is holding on to an internal copy of `client` because
                  //   `client` existed back when we built runTests
                  //   up in `buildRunner`
于 2016-03-21T20:23:29.297 に答える