2016-10-03 4 views
0

ノードjs REST APIで非同期メソッドを使用する方法を学習しようとしています。ノード非同期メソッドがイテレータからの結果を検出しない

ゴール

私は各1を通じてキーの範囲のためのデータベース...とループを問い合わせます。私は、結果が現在の日付/時刻スタンプと一致するかどうかチェックし、そうであれば一致するキーに対してHGETALLクエリを実行します。 HGETALLの結果をjsonデータとして自分のREST APIのコンシューマーに送信したいと思います。

問題

私のコードが正しくHGETALLのために、後で、その後...キーの初期セットのためのデータベースを照会し。 しかし、結果を送り返そうとすると、現在Webページには何も表示されません。

ここでは、コードです:私はRedisのデータベースへの私の最初のクエリをオフに送信ところ

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行目であり、それは結果の配列を返します。

行49-56は、イテレータメソッド...を結果セットの各結果に対して1回呼び出す非同期メソッドです。

18行目では、イテレータから非同期メソッドにデータを戻そうとしています。

質問明らかに、私はこれが私の最初の質問になりますので、私は私のデータを返すてる方法で何かを台無しにしました

  1. - あなたは私が間違ってやっているかを見ることができます。

  2. 私が探しているものを見つけたら、reply [1](行49)を使って反復を止めるにはどうしたらいいですか?またqueryhgetall_default_ruleとid_ruleため

答えて

0
  1. 郵便番号。しかし、まず、すべてのモジュールを別のモジュールに分けて、そのHTTPリクエストの部分を除いてそれ自身をテストします。

  2. http://caolan.github.io/async/docs.html#.someを参照してください。

はまた約束、Promise.anyに見て、そしてawaitはちょうどループの時にいずれかを実行することで(バベルを必要とします)。それらは学習に時間がかかる有用なトピックです。

関連する問題