【问题标题】:Redlock error in node js节点js中的红锁错误
【发布时间】:2016-04-16 14:17:55
【问题描述】:

我正在尝试使用 redlock 模块,但我遇到了无法通过的错误。

这是我的 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 - 信息:TypeError:无法读取未定义的属性“设置” 应要求(/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/promise.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) 在 Object.module.exports.lockRessource (/usr/app/redisdata.js:42:10)

你知道这可能来自哪里吗?看起来我并没有对那个模块做任何疯狂的事情。

非常感谢!

【问题讨论】:

    标签: javascript node.js redis locking


    【解决方案1】:

    分配客户端后初始化红锁。

    您的红锁文件将如下所示:

    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) { })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 2017-11-21
      • 2019-06-19
      • 2012-02-21
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多