2011-08-10 6 views
0

비동기 작성자 here이 게시 한 예제를 따르고 있었지만 오류가 발생했습니다.async.concat을 사용하여 redis에서 데이터를 검색 할 때 오류가 발생했습니다.

  • 레디 스-2.2.12
  • 노드 v0.4.11 미리 여기

내 코드입니다 :

$ 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

:

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

는 다음과 같은 출력을 생성합니다 비동기 실행 client.hgetall, 그것은 va를 삭제합니다. 계시는 의 안쪽은 hgetall입니다. 익명의 함수를 묶어서 붙이거나 아래 그림과 같이 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' } ] 

신비 실패를 디버깅하려면, 당신은 node_redis에서 디버그 로깅을 설정 할 수있는 레디 스 명령을 전송하기 전에 redis.debug_mode = true;을 수행하여 여기에 당신이 원하는 것을 할 것 같다 버전입니다 .

관련 문제