2016-04-14 2 views
0

Я пытаюсь использовать модуль redlock, но у меня есть ошибка, с которой я не могу пройти.Ошибка Redlock в узле js

Вот что мой файл redlock выглядит следующим образом:

var redis = require('redis'); 
var Redlock = require('redlock'); 
var logger = require('./logger.js'); 

var client; 

module.exports.redisConnection = function(port,host){ 
    client = redis.createClient(port,host); 

    client.on('connect',function(){ 
     logger.info("Redis default connection open to "+host+":"+port); 
    }); 

    client.on('error',function(err){ 
     logger.info("Redis default connection error "+err); 
     logger.info("Redis Path : "+host+":"+port); 
    }); 

    process.on('SIGINT', function() { 
     client.quit();  
     logger.info("Redis default connection disconnected"); 
     process.exit(0); 
    }); 
}; 

var redlock = new Redlock(
    [client], 
    { 
     driftFactor : 0.01, 
     retryCount : 15, 
     retryDelay : 200 
    } 
); 

redlock.on('clientError', function(err) { 
    logger.info("A Redis Error Has Occurred : "+err); 
}); 

module.exports.lockRessource = function(ressource_id,callback){ 
    redlock.lock(ressource_id,2000,function(err,lock){ 
     if(err){ 
      callback(err,null); 
     } 
     else{ 
      callback(null,lock); 
     } 
    }); 
}; 

module.exports.unlockLock = function(lock,callback){ 

    lock.unlock(function(err){ 
     if(err){ 
      callback(true,null); 
     } 
     else{ 
      callback(null,true); 
     } 
    }); 
}; 

При попытке вызова функции lockRessource из другого модуля, я получаю сообщение об ошибке:

2016-04-14T16: 28: 55,020 - info: TypeError: Невозможно прочитать свойство 'set' of undefined по запросу (/usr/app/node_modules/redlock/redlock.js:260:18) в /usr/app/node_modules/redlock/redlock.js:314: 12 на Array.forEach (родной) при попытке (/usr/app/node_modules/redlock/redlock.js:313:24) на /usr/app/node_modules/redlock/redlock.js:318:10 на Promise._execute (/usr/app/node_modules/redlock/node_modules/bluebird/js/release/debuggability.js:272:9) в Promise._resolveFromExecutor (/usr/app/node_modules/redlock/node_modules/bluebird/js/release/promise.js:474:18) в новом Promise (/ usr/app/node_modules/redlock/node_modules/bluebird/js/release/prom.js: 77: 14) на Redlock._lock (/usr/app/node_modules/redlock/redlock.js:249:9) на Redlock.lock (/ usr/app/node_modules/redlock/redlock. js: 111: 14) at Object.module.exports.lockRessource (/usr/app/redisdata.js:42:10)

У вас есть идеи, откуда это может произойти? Похоже, я не делаю ничего сумасшедшего с этим модулем.

Большое спасибо!

ответ

0

Инициализация блокировки после назначения клиенту.

Ваш файл redlock будет выглядеть следующим образом:

var redis = require('redis'); 
var Redlock = require('redlock'); 
var logger = require('./logger.js'); 

var client; 
var redlock; 

module.exports.redisConnection = function(port,host){ 
    client = redis.createClient(port,host); 
    redlock = new Redlock(
     [client], 
     { 
      driftFactor : 0.01, 
      retryCount : 15, 
      retryDelay : 200 
     } 
    ); 

    client.on('connect',function(){ 
     logger.info("Redis default connection open to "+host+":"+port); 
    }); 

    client.on('error',function(err){ 
     logger.info("Redis default connection error "+err); 
     logger.info("Redis Path : "+host+":"+port); 
    }); 

    redlock.on('clientError', function(err) { 
     logger.info("A Redis Error Has Occurred : "+err); 
    }); 

    process.on('SIGINT', function() { 
     client.quit(); 
     logger.info("Redis default connection disconnected"); 
     process.exit(0); 
    }); 
}; 

module.exports.lockRessource = function(ressource_id,callback){ 
    redlock.lock(ressource_id,2000,function(err,lock){ 
     if(err){ 
      callback(err,null); 
     } 
     else{ 
      callback(null,lock); 
     } 
    }); 
}; 

module.exports.unlockLock = function(lock,callback){ 

    lock.unlock(function(err){ 
     if(err){ 
      callback(true,null); 
     } 
     else{ 
      callback(null,true); 
     } 
    }); 
}; 

Если вы хотите использовать этот модуль, вызовите redisConnection первым.
Предположим, что имя файла выше «redlock.js».

resource = require('./redlock.js') 

resource.redisConnection(6379, "127.0.0.1") 
resource.lockRessource("your resourceId", function(err, lock) { }) 
Смежные вопросы