Ошибка при попытке использовать async.concat для получения данных из Redis - PullRequest
0 голосов
/ 10 августа 2011

Я следовал примеру, опубликованному асинхронным автором здесь , но я получаю сообщение об ошибке.

  • redis-2.2.12
  • node v0.4.11-pre

Вот мой код:

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)

1 Ответ

4 голосов
/ 20 сентября 2011

Когда асинхронный запуск client.hgetall, он удаляет значение this внутри 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; перед отправкой любых команд Redis.

...