2016-04-14 77 views
0

我想使用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:無法根據請求(/usr/app/node_modules/redlock/redlock.js:260:18) 在/usr/app/node_modules/redlock/redlock.js:314處讀取未定義的 屬性'set': 12 at Array.forEach(native) at attempt(/usr/app/node_modules/redlock/redlock.js:313:24) at /usr/app/node_modules/redlock/redlock.js:318:10 at 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) 在新無極(在/ usr /應用程序/ node_modules/redlock/node_modules /藍鳥/ JS/(/usr/app/node_modules/redlock/redlock.js:249:9) at Redlock.lock(/ usr/app/node_modules/redlock/redlock。)在Redlock._lock(/usr/app/node_modules/redlock.js:249:9)發佈/ promise.js:77:14) 。 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) { })