2016-02-25 72 views
0
TypeError: Cannot read property 'zcard' of null 
    at Queue.card (/Users/narain/Sites/integrity-automation/node_modules/kue/lib/kue.js:513:14) 
    at Queue.inactiveCount (/Users/narain/Sites/integrity-automation/node_modules/kue/lib/kue.js:616:17) 
    at _ (/Users/narain/Sites/integrity-automation/node_modules/kue/lib/http/routes/json.js:318:19) 
    at exports.stats (/Users/narain/Sites/integrity-automation/node_modules/kue/lib/http/routes/json.js:41:3) 
    at Layer.handle [as handle_request] (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/layer.js:95:5) 
    at next (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/route.js:131:13) 
    at /Users/narain/Sites/integrity-automation/node_modules/kue/lib/http/middleware/provides.js:11:36 
    at Layer.handle [as handle_request] (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/layer.js:95:5) 
    at next (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/route.js:131:13) 
    at Route.dispatch (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/route.js:112:3) 
    at Layer.handle [as handle_request] (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/layer.js:95:5) 
    at /Users/narain/Sites/integrity-automation/node_modules/express/lib/router/index.js:277:22 
    at Function.process_params (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/index.js:330:12) 
    at next (/Users/narain/Sites/integrity-automation/node_modules/express/lib/router/index.js:271:10) 
    at SendStream.error (/Users/narain/Sites/integrity-automation/node_modules/serve-static/index.js:120:7) 
    at emitOne (events.js:77:13) 
    at SendStream.emit (events.js:169:7) 
    at SendStream.error (/Users/narain/Sites/integrity-automation/node_modules/send/index.js:245:17) 
    at SendStream.onStatError (/Users/narain/Sites/integrity-automation/node_modules/send/index.js:356:12) 
    at next (/Users/narain/Sites/integrity-automation/node_modules/send/index.js:630:16) 
    at onstat (/Users/narain/Sites/integrity-automation/node_modules/send/index.js:619:14) 
    at FSReqWrap.oncomplete (fs.js:82:15) 

我越来越此错误相当一致地在下列条件下:苦厄 - 类型错误:无法读取空的特性“zcard”

  1. 有钜UI仪表板在浏览器窗口中打开
  2. 执行优雅关机

我不确定是否预计Queue.client为空。如果是,则Queue.prototype.card应该在致电this.client.card之前首先检查是否存在this.client。同样的,Queue.prototype.cardByType

这里是我的API路线dashboard/stop代码(即停止该进程并刷新缓存):

exports.stop = function(success, failure) { 

    let shutdown = new Promise((resolve, reject) => { 
    debug('shutting down queue'); 
    queue.shutdown().then(() => { 
     client.flushdb(); // flushing the redis server 
     debug('redis is flushed'); 
     resolve({success: true}); 
    }, 
    (err) => { 
     reject(err); 
    }); 
    }); 

    return shutdown; 

}; 

注:queueKue一个实例,并clientredis

let queue = require('kue').createQueue({prefix: '', redis: config.get('redisurl'), jobEvents: false}); 

let client = require('redis').createClient({ 
    'url': config.get('redis') // redis-url 
}); 

github上也提出了同样的问题(问题):

  1. https://github.com/Automattic/kue/issues/825
  2. https://github.com/StreetHub/kue-ui/issues/23

而且都没有反应尚未..

任何想法/想法!如何获得此修复..?

回答

0

问题是造成由于Queue.prototype.shutdown实施破坏客户端(即,Redis的)实例,这就是为什么当它调用Queue.prototype.cardQueue.prototype.cardByType然后它抛出这个错误..

至于我的目的是要以某种方式停止(暂停)排队过程,然后再恢复它..所以我做了这样的事情,而不是使用Queue.prototype.shutdown我已经相当使用Worker.prototype.shutdown其暂停工人的(过程)..

queue.js(样品):

this.queue = kue.createQueue({prefix: opts.prefix, redis: opts.redis, jobEvents: false, disableSearch: false}); // kue instance 

stopAllWorkers() { 
    return new Promise((resolve, reject) => { 
     var length = this.queue.workers.length; 
     this.queue.workers.forEach((worker) => { 
     worker.shutdown(() => { 
      if (--length === 0) { 
      resolve(); 
      } 
     }); 
     }); 
    }); 
    } 

serverRunner.js(样品):

var queue = require('./queue'); 

exports.start = function(success, failure) { 
    // resume the queue process 
} 

exports.stop = function(success, failure) { 
    return new Promise((resolve, reject) => { 
    queue.removeAllListeners(); 
    queue.stopAllWorkers().then(() => { 
     debug('Queue All workers stopped!!'); 
     resolve({success: true}); 
    }); 
    }); 
}; 

这就是它!

希望这可以帮助别人!

干杯。

相关问题