2011-08-10 109 views
0

我当时正在关注异步作者here发布的示例,但出现错误。尝试使用async.concat从redis检索数据时出错

  • Redis的-2.2.12
  • 节点v0.4.11预

这里是我的代码:

var async = require('async'); 
var redis = require('redis'); 

var keys = ['key1', 'key2', 'key3']; 

var client = redis.createClient(); 
var multi = client.multi(); 
for (var key in keys) { 
    multi.hmset(key, {'some': 'value'}); 
} 
multi.exec(function(err, res) { 
    if (err) throw err; 
    console.dir(res); 

    var myCallback = function(err, res) { 
    console.log('in myCallback'); 
    console.dir(res); 
    client.quit(); 
    process.exit(); 
    }; 
async.concat(keys, client.hgetall, myCallback); 
}); 

产生以下输出:

$ node redis_test.js 
[ 'OK', 'OK', 'OK' ] 

node.js:134 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Object #<Object> has no method 'send_command' 
    at /home/project/node_modules/redis/index.js:666:25 
    at /home/project/node_modules/async/lib/async.js:508:13 
    at /home/project/node_modules/async/lib/async.js:97:13 
    at Array.forEach (native) 
    at /home/project/node_modules/async/lib/async.js:26:24 
    at /home/project/node_modules/async/lib/async.js:96:9 
    at /home/project/node_modules/async/lib/async.js:507:9 
    at Object.concat (/home/project/node_modules/async/lib/async.js:141:23) 
    at /home/project/redis_test.js:21:9 
    at Command.callback (/home/project/node_modules/redis/index.js:827:13) 

回答

4

当异步运行client.hgetall,它会破坏va hgetall内部的this。您可以包装一个匿名函数以将其粘合在一起,或者使用fn.bind(),如下所示。您还希望避免使用for .. in来遍历数组。使用常规循环或arr.forEach()。你的例子会被写成神秘的失败。下面是似乎做你想要的版本:

var async = require('async'); 
var redis = require('redis'); 
var keys = ['key1', 'key2', 'key3']; 

var client = redis.createClient(); 
var multi = client.multi(); 
keys.forEach(function (key) { 
    multi.hmset(key, {'some': 'value'}); 
}); 
multi.exec(function(err, res) { 
    if (err) throw err; 
    console.dir(res); 

    var myCallback = function(err, res) { 
    console.log('in myCallback'); 
    console.dir(res); 
    client.quit(); 
    process.exit(); 
    }; 
async.concat(keys, client.hgetall.bind(client), myCallback); 
}); 

此输出:

[ 'OK', 'OK', 'OK' ] 
in myCallback 
[ { some: 'value' }, 
    { some: 'value' }, 
    { some: 'value' } ] 

要调试神秘的故障,您可以在node_redis打开调试日志发送任何Redis的命令之前做redis.debug_mode = true;

相关问题