2011-08-10 13 views
0

asyncの投稿者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を破棄しますの内のthisの中にある。匿名関数をまとめて貼り付けるか、以下に示すようにfn.bind()を使用してください。

for .. inを使用して配列を反復処理することも避けたいとします。通常のforループまたは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' } ] 

を神秘的な失敗をデバッグするには、任意のRedisのコマンドを送信する前にredis.debug_mode = true;を行うことによってnode_redisでデバッグログを有効にすることができます。