节点异步方法未检测到迭代器

时间:2016-10-03 20:23:51

标签: node.js express asynchronous

我正在尝试学习如何在我的节点js REST API中使用async方法。

目标

我在数据库中查询一系列键...并遍历每一个键。我检查是否有任何结果与我当前的日期/时间戳匹配,如果是,我在匹配键上进行HGETALL查询。 我想将HGETALL的结果作为json数据发送给我的REST API的使用者。

问题

我的代码正确地在数据库中查询初始密钥集......然后在HGETALL中查询。 但是..当我尝试发回结果时,网页上当前没有显示任何内容。

以下是代码:

var id_rule = function (redis_key, doneCallBack) {  
    console.log('iterator called with key:' + redis_key);
    //if this is the default rule, skip it  
    if (redis_key.indexOf('00:00_00:00') == -1){
        //time match
        var rule_times = parse_time_from_key(redis_key);
        var current = getCurrentUTC(); // returns something like [ 1158, 'mon' ]        
        if ( (current[0] >= rule_times[0] && current[0] <= rule_times[1]) && (rule_times[2].indexOf((current[1].substring(0,1))) != -1)) {
            var widgetkey = redis_key.split("widget:");             
            redis.hgetall("widget:" + widgetkey[1], function (err, data) {
                if (err) {
                    console.log("hgetall method fails: " + err);
                    return doneCallBack(err, false);
                }
                if (data) { 
                    console.log('bingo: ' + widgetkey[1] + "returned a match");
                    console.log(data);
                    return doneCallBack(false, data);
                } else { 
                    return doneCallBack(false, false);
                }                                       
            }); 
        } else {  
            return doneCallBack(false, false);
        }
    };
}

router.get('/:widgetnum', function(req, res, next) {
    //validate widgetnum format 
    var widgetnum = req.params.widgetnum;
    if ( !valid_e164(widgetnum) ) {
        var retval = {"res":false, "msg":"malformed widget"};
        res.send(JSON.stringify(retval));
    }
    console.log('scanning db for:  widget:' + widgetnum + "*");
    redis.send_command("SCAN", [0, "MATCH", "widget:" + widgetnum + "*", "COUNT","1000"], function (err, reply) {
        if (err) {
            res.send(JSON.stringify({"res":false,"msg":"no matching widget records found"}));
        }
        if (reply) {                    
            if (reply[1].length == 2) {
                //queryfordefault rule
                async.map(reply[1], queryhgetall_default_rule, function(err, results) {
                    console.log('inside here!');
                    res.send(JSON.stringify(results));
                });
            } else {
                async.map(reply[1], id_rule, function (err, iteration_results) {

                    if (err) {
                        res.send(JSON.stringify("false"));
                    }
                    if (iteration_results) {                    
                        res.send(JSON.stringify(iteration_results));
                    }                       
                });
            }
        }
    });

});

第37行是我将第一个查询发送到redis数据库的地方,它返回一个结果数组。

第49-56行是异步方法,它为结果集中的每个结果调用我的迭代器方法...一次。

第18行是我尝试将数据从迭代器返回到异步方法的地方。

问题

  1. 显然,我已经弄清楚了我回复数据的方式,所以这是我的第一个问题 - 你能看出我做错了什么。

  2. 一旦我找到了我正在寻找的内容,如何停止回复[1](第49行)?

1 个答案:

答案 0 :(得分:0)

  1. 也发布了queryhgetall_default_rule和id_rule的代码。但首先要将所有内容分解为一个不同的模块,并在没有HTTP请求部分的情况下自行测试。

  2. 请参阅http://caolan.github.io/async/docs.html#.some

  3. 同时查看promises,Promise.any和await(需要babel),只需要一个for循环做一个。这些是有用的主题,需要一些时间来学习。