【问题标题】:Error when trying to use async.concat to retrieve data from redis尝试使用 async.concat 从 redis 检索数据时出错
【发布时间】:2011-10-23 19:47:16
【问题描述】:

我正在关注异步作者 here 发布的示例,但出现错误。

  • redis-2.2.12
  • 节点 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)

【问题讨论】:

    标签: asynchronous node.js redis


    【解决方案1】:

    当异步运行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' } ]
    

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

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 2016-12-17
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多